app_store_dev_api 0.1.9 → 0.3.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 (307) hide show
  1. checksums.yaml +4 -4
  2. data/.DS_Store +0 -0
  3. data/.claude/settings.local.json +40 -0
  4. data/CHANGELOG.md +59 -2
  5. data/CLAUDE.md +256 -0
  6. data/Gemfile.lock +29 -20
  7. data/README.md +212 -20
  8. data/Rakefile +99 -1
  9. data/SCRIPTS_ANALYSIS.md +261 -0
  10. data/docs/openapi.oas4.2.json +231546 -0
  11. data/install_local.bat +166 -0
  12. data/install_local.sh +84 -0
  13. data/install_local_fixed.sh +84 -0
  14. data/lib/.DS_Store +0 -0
  15. data/lib/app_store_dev_api/client/authorization.rb +7 -2
  16. data/lib/app_store_dev_api/client/builder.rb +43 -38
  17. data/lib/app_store_dev_api/client/options.rb +1 -1
  18. data/lib/app_store_dev_api/client.rb +31 -60
  19. data/lib/app_store_dev_api/object/attributes.rb +1 -1
  20. data/lib/app_store_dev_api/object/data.rb +6 -2
  21. data/lib/app_store_dev_api/object/relationships.rb +47 -0
  22. data/lib/app_store_dev_api/requests/v1/accessibility_declaration/create.rb +28 -0
  23. data/lib/app_store_dev_api/requests/v1/accessibility_declaration/update.rb +26 -0
  24. data/lib/app_store_dev_api/requests/v1/age_rating_declaration/update.rb +43 -0
  25. data/lib/app_store_dev_api/requests/v1/alternative_distribution_domain/create.rb +22 -0
  26. data/lib/app_store_dev_api/requests/v1/alternative_distribution_key/create.rb +25 -0
  27. data/lib/app_store_dev_api/requests/v1/alternative_distribution_package/create.rb +22 -0
  28. data/lib/app_store_dev_api/requests/v1/analytics_report_request/create.rb +25 -0
  29. data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/create.rb +26 -0
  30. data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/update.rb +22 -0
  31. data/lib/app_store_dev_api/requests/v1/app/update.rb +18 -20
  32. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/create.rb +32 -0
  33. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/update.rb +32 -0
  34. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/create.rb +22 -0
  35. data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/update.rb +22 -0
  36. data/lib/app_store_dev_api/requests/v1/app_clip_app_store_review_detail/create.rb +19 -0
  37. data/lib/app_store_dev_api/requests/v1/{builds → app_clip_app_store_review_detail}/update.rb +4 -5
  38. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/create.rb +27 -0
  39. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/update.rb +25 -0
  40. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/create.rb +26 -0
  41. data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/update.rb +21 -0
  42. data/lib/app_store_dev_api/requests/v1/app_clip_header_image/create.rb +26 -0
  43. data/lib/app_store_dev_api/requests/v1/app_clip_header_image/update.rb +22 -0
  44. data/lib/app_store_dev_api/requests/v1/app_custom_product_page/create.rb +28 -0
  45. data/lib/app_store_dev_api/requests/v1/app_custom_product_page/update.rb +22 -0
  46. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/create.rb +26 -0
  47. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/update.rb +21 -0
  48. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/create.rb +26 -0
  49. data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/update.rb +21 -0
  50. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration/create.rb +22 -0
  51. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/create.rb +24 -0
  52. data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/update.rb +21 -0
  53. data/lib/app_store_dev_api/requests/v1/app_event/create.rb +26 -0
  54. data/lib/app_store_dev_api/requests/v1/app_event/update.rb +24 -0
  55. data/lib/app_store_dev_api/requests/v1/app_event_localization/create.rb +28 -0
  56. data/lib/app_store_dev_api/requests/v1/app_event_localization/update.rb +23 -0
  57. data/lib/app_store_dev_api/requests/v1/app_event_screenshot/create.rb +27 -0
  58. data/lib/app_store_dev_api/requests/v1/app_event_screenshot/update.rb +21 -0
  59. data/lib/app_store_dev_api/requests/v1/app_event_video_clip/create.rb +22 -0
  60. data/lib/app_store_dev_api/requests/v1/{promoted_purchases_image → app_event_video_clip}/update.rb +4 -4
  61. data/lib/app_store_dev_api/requests/v1/app_info/update.rb +15 -18
  62. data/lib/app_store_dev_api/requests/v1/app_info_localization/create.rb +17 -17
  63. data/lib/app_store_dev_api/requests/v1/app_info_localization/update.rb +14 -18
  64. data/lib/app_store_dev_api/requests/v1/app_preview/create.rb +22 -0
  65. data/lib/app_store_dev_api/requests/v1/app_preview/update.rb +22 -0
  66. data/lib/app_store_dev_api/requests/v1/app_preview_set/create.rb +25 -0
  67. data/lib/app_store_dev_api/requests/v1/app_preview_set/replace_app_previews_linkage.rb +19 -0
  68. data/lib/app_store_dev_api/requests/v1/app_price_schedule/create.rb +24 -0
  69. data/lib/app_store_dev_api/requests/v1/app_screenshot/create.rb +24 -0
  70. data/lib/app_store_dev_api/requests/v1/app_screenshot/update.rb +21 -0
  71. data/lib/app_store_dev_api/requests/v1/app_screenshot_set/create.rb +25 -0
  72. data/lib/app_store_dev_api/requests/v1/app_screenshot_set/replace_app_screenshots_linkage.rb +19 -0
  73. data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/create.rb +20 -0
  74. data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/update.rb +21 -0
  75. data/lib/app_store_dev_api/requests/v1/app_store_review_detail/create.rb +19 -20
  76. data/lib/app_store_dev_api/requests/v1/app_store_review_detail/update.rb +17 -18
  77. data/lib/app_store_dev_api/requests/v1/app_store_version/create.rb +20 -16
  78. data/lib/app_store_dev_api/requests/v1/app_store_version/update.rb +20 -18
  79. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/create.rb +26 -0
  80. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/update.rb +23 -0
  81. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/create.rb +27 -0
  82. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/update.rb +22 -0
  83. data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment_localization/create.rb +25 -0
  84. data/lib/app_store_dev_api/requests/v1/app_store_version_localization/create.rb +18 -18
  85. data/lib/app_store_dev_api/requests/v1/app_store_version_localization/update.rb +15 -18
  86. data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/create.rb +7 -2
  87. data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/update.rb +2 -2
  88. data/lib/app_store_dev_api/requests/v1/app_store_version_promotion/create.rb +10 -13
  89. data/lib/app_store_dev_api/requests/v1/{app_store_version_releases_request → app_store_version_release_request}/create.rb +5 -3
  90. data/lib/app_store_dev_api/requests/v1/app_tag/update.rb +21 -0
  91. data/lib/app_store_dev_api/requests/v1/background_asset/create.rb +19 -0
  92. data/lib/app_store_dev_api/requests/v1/background_asset/update.rb +21 -0
  93. data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/create.rb +27 -0
  94. data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/update.rb +23 -0
  95. data/lib/app_store_dev_api/requests/v1/background_asset_version/create.rb +16 -0
  96. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/create.rb +26 -0
  97. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/update.rb +21 -0
  98. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/create.rb +26 -0
  99. data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/update.rb +21 -0
  100. data/lib/app_store_dev_api/requests/v1/beta_app_localization/create.rb +30 -0
  101. data/lib/app_store_dev_api/requests/v1/beta_app_localization/update.rb +25 -0
  102. data/lib/app_store_dev_api/requests/v1/beta_app_review_detail/update.rb +28 -0
  103. data/lib/app_store_dev_api/requests/v1/beta_app_review_submission/create.rb +22 -0
  104. data/lib/app_store_dev_api/requests/v1/beta_build_localization/create.rb +18 -18
  105. data/lib/app_store_dev_api/requests/v1/beta_build_localization/update.rb +15 -20
  106. data/lib/app_store_dev_api/requests/v1/beta_group/create.rb +33 -0
  107. data/lib/app_store_dev_api/requests/v1/beta_group/update.rb +27 -0
  108. data/lib/app_store_dev_api/requests/v1/beta_license_agreement/update.rb +21 -0
  109. data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/create.rb +25 -0
  110. data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/update.rb +21 -0
  111. data/lib/app_store_dev_api/requests/v1/beta_tester/create.rb +28 -0
  112. data/lib/app_store_dev_api/requests/v1/beta_tester_invitation/create.rb +23 -0
  113. data/lib/app_store_dev_api/requests/v1/build_beta_detail/update.rb +10 -13
  114. data/lib/app_store_dev_api/requests/v1/{subscription_price_change_consent_reason → build_beta_notification}/create.rb +8 -2
  115. data/lib/app_store_dev_api/requests/v1/build_upload/create.rb +27 -0
  116. data/lib/app_store_dev_api/requests/v1/build_upload_file/create.rb +28 -0
  117. data/lib/app_store_dev_api/requests/v1/build_upload_file/update.rb +22 -0
  118. data/lib/app_store_dev_api/requests/v1/bundle_id/create.rb +12 -15
  119. data/lib/app_store_dev_api/requests/v1/bundle_id/update.rb +20 -0
  120. data/lib/app_store_dev_api/requests/v1/bundle_id_capability/create.rb +13 -16
  121. data/lib/app_store_dev_api/requests/v1/bundle_id_capability/update.rb +18 -0
  122. data/lib/app_store_dev_api/requests/v1/certificate/create.rb +14 -15
  123. data/lib/app_store_dev_api/requests/v1/certificate/update.rb +17 -0
  124. data/lib/app_store_dev_api/requests/v1/ci_build_run/create.rb +28 -0
  125. data/lib/app_store_dev_api/requests/v1/ci_workflow/create.rb +41 -0
  126. data/lib/app_store_dev_api/requests/v1/ci_workflow/update.rb +39 -0
  127. data/lib/app_store_dev_api/requests/v1/customer_review_response_v1/create.rb +25 -0
  128. data/lib/app_store_dev_api/requests/v1/device/update.rb +18 -0
  129. data/lib/app_store_dev_api/requests/v1/end_app_availability_pre_order/create.rb +16 -0
  130. data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/create.rb +24 -0
  131. data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/update.rb +24 -0
  132. data/lib/app_store_dev_api/requests/v1/game_center_achievement/create.rb +31 -0
  133. data/lib/app_store_dev_api/requests/v1/game_center_achievement/update.rb +26 -0
  134. data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/create.rb +26 -0
  135. data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/update.rb +21 -0
  136. data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/create.rb +28 -0
  137. data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/update.rb +23 -0
  138. data/lib/app_store_dev_api/requests/v1/game_center_achievement_release/create.rb +23 -0
  139. data/lib/app_store_dev_api/requests/v1/game_center_activity/create.rb +32 -0
  140. data/lib/app_store_dev_api/requests/v1/game_center_activity/update.rb +27 -0
  141. data/lib/app_store_dev_api/requests/v1/game_center_activity_image/create.rb +27 -0
  142. data/lib/app_store_dev_api/requests/v1/game_center_activity_image/update.rb +21 -0
  143. data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/create.rb +27 -0
  144. data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/update.rb +22 -0
  145. data/lib/app_store_dev_api/requests/v1/game_center_activity_version/create.rb +25 -0
  146. data/lib/app_store_dev_api/requests/v1/game_center_activity_version/update.rb +21 -0
  147. data/lib/app_store_dev_api/requests/v1/game_center_activity_version_release/create.rb +23 -0
  148. data/lib/app_store_dev_api/requests/v1/game_center_app_version/create.rb +22 -0
  149. data/lib/app_store_dev_api/requests/v1/game_center_app_version/update.rb +21 -0
  150. data/lib/app_store_dev_api/requests/v1/game_center_challenge/create.rb +31 -0
  151. data/lib/app_store_dev_api/requests/v1/game_center_challenge/update.rb +28 -0
  152. data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/create.rb +27 -0
  153. data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/update.rb +21 -0
  154. data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/create.rb +27 -0
  155. data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/update.rb +22 -0
  156. data/lib/app_store_dev_api/requests/v1/game_center_challenge_version/create.rb +22 -0
  157. data/lib/app_store_dev_api/requests/v1/game_center_challenge_version_release/create.rb +23 -0
  158. data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → game_center_detail}/create.rb +9 -4
  159. data/lib/app_store_dev_api/requests/v1/game_center_detail/update.rb +29 -0
  160. data/lib/app_store_dev_api/requests/v1/{customer_review_response → game_center_group}/create.rb +6 -4
  161. data/lib/app_store_dev_api/requests/v1/game_center_group/update.rb +21 -0
  162. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/create.rb +38 -0
  163. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/update.rb +32 -0
  164. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_entry_submission/create.rb +27 -0
  165. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/create.rb +26 -0
  166. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/update.rb +21 -0
  167. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/create.rb +30 -0
  168. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/update.rb +25 -0
  169. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_release/create.rb +23 -0
  170. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/create.rb +28 -0
  171. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/update.rb +21 -0
  172. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/create.rb +26 -0
  173. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/update.rb +21 -0
  174. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/create.rb +26 -0
  175. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/update.rb +21 -0
  176. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/create.rb +27 -0
  177. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/update.rb +21 -0
  178. data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_release/create.rb +23 -0
  179. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/create.rb +27 -0
  180. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/update.rb +26 -0
  181. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/create.rb +29 -0
  182. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/update.rb +23 -0
  183. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/create.rb +24 -0
  184. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/update.rb +22 -0
  185. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set_test/create.rb +23 -0
  186. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/create.rb +27 -0
  187. data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/update.rb +22 -0
  188. data/lib/app_store_dev_api/requests/v1/game_center_player_achievement_submission/create.rb +26 -0
  189. data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/create.rb +9 -3
  190. data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/update.rb +4 -3
  191. data/lib/app_store_dev_api/requests/v1/in_app_purchase_availability/create.rb +13 -12
  192. data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/create.rb +24 -0
  193. data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/update.rb +18 -0
  194. data/lib/app_store_dev_api/requests/v1/in_app_purchase_localization/create.rb +14 -14
  195. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/create.rb +27 -0
  196. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/update.rb +21 -0
  197. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/create.rb +27 -0
  198. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/update.rb +21 -0
  199. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/create.rb +27 -0
  200. data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/update.rb +21 -0
  201. data/lib/app_store_dev_api/requests/v1/in_app_purchase_price_schedule/create.rb +11 -10
  202. data/lib/app_store_dev_api/requests/v1/in_app_purchase_submission/create.rb +9 -10
  203. data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/create.rb +25 -0
  204. data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/update.rb +21 -0
  205. data/lib/app_store_dev_api/requests/v1/{promoted_purchases → marketplace_webhook}/create.rb +7 -5
  206. data/lib/app_store_dev_api/requests/v1/marketplace_webhook/update.rb +22 -0
  207. data/lib/app_store_dev_api/requests/v1/merchant_id/create.rb +22 -0
  208. data/lib/app_store_dev_api/requests/v1/{app_price_schedule → merchant_id}/update.rb +7 -3
  209. data/lib/app_store_dev_api/requests/v1/nomination/create.rb +39 -0
  210. data/lib/app_store_dev_api/requests/v1/nomination/update.rb +40 -0
  211. data/lib/app_store_dev_api/requests/v1/pass_type_id/create.rb +22 -0
  212. data/lib/app_store_dev_api/requests/v1/pass_type_id/update.rb +21 -0
  213. data/lib/app_store_dev_api/requests/v1/profile/create.rb +14 -23
  214. data/lib/app_store_dev_api/requests/v1/promoted_purchase/create.rb +28 -0
  215. data/lib/app_store_dev_api/requests/v1/{promoted_purchases → promoted_purchase}/update.rb +4 -3
  216. data/lib/app_store_dev_api/requests/v1/review_submission/create.rb +11 -7
  217. data/lib/app_store_dev_api/requests/v1/review_submission/update.rb +12 -15
  218. data/lib/app_store_dev_api/requests/v1/review_submission_item/create.rb +20 -8
  219. data/lib/app_store_dev_api/requests/v1/review_submission_item/update.rb +18 -0
  220. data/lib/app_store_dev_api/requests/v1/routing_app_coverage/create.rb +24 -0
  221. data/lib/app_store_dev_api/requests/v1/routing_app_coverage/update.rb +21 -0
  222. data/lib/app_store_dev_api/requests/v1/subscription/create.rb +17 -17
  223. data/lib/app_store_dev_api/requests/v1/subscription/update.rb +19 -17
  224. data/lib/app_store_dev_api/requests/v1/subscription_app_store_review_screenshot/create.rb +26 -0
  225. data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → subscription_app_store_review_screenshot}/update.rb +4 -3
  226. data/lib/app_store_dev_api/requests/v1/subscription_availability/create.rb +13 -12
  227. data/lib/app_store_dev_api/requests/v1/subscription_grace_period/update.rb +13 -16
  228. data/lib/app_store_dev_api/requests/v1/subscription_group/create.rb +12 -13
  229. data/lib/app_store_dev_api/requests/v1/subscription_group/update.rb +10 -14
  230. data/lib/app_store_dev_api/requests/v1/subscription_group_localization/create.rb +14 -16
  231. data/lib/app_store_dev_api/requests/v1/subscription_group_localization/update.rb +11 -16
  232. data/lib/app_store_dev_api/requests/v1/subscription_group_submission/create.rb +9 -10
  233. data/lib/app_store_dev_api/requests/v1/subscription_image/create.rb +20 -0
  234. data/lib/app_store_dev_api/requests/v1/subscription_image/update.rb +21 -0
  235. data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/create.rb +18 -18
  236. data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/update.rb +10 -15
  237. data/lib/app_store_dev_api/requests/v1/subscription_localization/create.rb +14 -16
  238. data/lib/app_store_dev_api/requests/v1/subscription_offer_code/create.rb +19 -19
  239. data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/create.rb +9 -5
  240. data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/update.rb +2 -3
  241. data/lib/app_store_dev_api/requests/v1/subscription_offer_code_one_time_use_code/create.rb +14 -15
  242. data/lib/app_store_dev_api/requests/v1/subscription_price/create.rb +15 -13
  243. data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/create.rb +17 -18
  244. data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/update.rb +10 -12
  245. data/lib/app_store_dev_api/requests/v1/subscription_submission/create.rb +9 -8
  246. data/lib/app_store_dev_api/requests/v1/{app_availability → territory_availability}/update.rb +4 -7
  247. data/lib/app_store_dev_api/requests/v1/user/update.rb +27 -0
  248. data/lib/app_store_dev_api/requests/v1/user_invitation/create.rb +30 -0
  249. data/lib/app_store_dev_api/requests/v1/webhook/create.rb +23 -0
  250. data/lib/app_store_dev_api/requests/v1/webhook/update.rb +21 -0
  251. data/lib/app_store_dev_api/requests/v1/webhook_delivery/create.rb +16 -0
  252. data/lib/app_store_dev_api/requests/v1/webhook_ping/create.rb +16 -0
  253. data/lib/app_store_dev_api/requests/v1/win_back_offer/create.rb +31 -0
  254. data/lib/app_store_dev_api/requests/v1/win_back_offer/update.rb +23 -0
  255. data/lib/app_store_dev_api/requests/v1/win_back_offer/update_prices_linkages.rb +18 -0
  256. data/lib/app_store_dev_api/requests/v2/app_availability/create.rb +13 -14
  257. data/lib/app_store_dev_api/requests/v2/app_availability_v2/create.rb +26 -0
  258. data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/create.rb +27 -0
  259. data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/update.rb +23 -0
  260. data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/create.rb +26 -0
  261. data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/update.rb +21 -0
  262. data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/create.rb +28 -0
  263. data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/update.rb +23 -0
  264. data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/create.rb +32 -0
  265. data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/update.rb +26 -0
  266. data/lib/app_store_dev_api/requests/v2/game_center_achievement_version_v2/create.rb +22 -0
  267. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/create.rb +26 -0
  268. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/update.rb +21 -0
  269. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/create.rb +30 -0
  270. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/update.rb +25 -0
  271. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/create.rb +26 -0
  272. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/update.rb +21 -0
  273. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/create.rb +26 -0
  274. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/update.rb +21 -0
  275. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/create.rb +29 -0
  276. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/update.rb +21 -0
  277. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_version_v2/create.rb +22 -0
  278. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/create.rb +39 -0
  279. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/update.rb +32 -0
  280. data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_version_v2/create.rb +22 -0
  281. data/lib/app_store_dev_api/requests/v2/in_app_purchase/create.rb +16 -17
  282. data/lib/app_store_dev_api/requests/v2/in_app_purchase/update.rb +12 -15
  283. data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/create.rb +29 -0
  284. data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/update.rb +23 -0
  285. data/lib/app_store_dev_api/requests/v2/{sandbox_tester → sandbox_tester_v2}/update.rb +5 -4
  286. data/lib/app_store_dev_api/requests/v2/{sandbox_tester_clear_purchase_history/update.rb → sandbox_testers_clear_purchase_history_request_v2/create.rb} +9 -3
  287. data/lib/app_store_dev_api/version.rb +1 -1
  288. data/lib/config/{schema.json → schema_backup.json} +1185 -51
  289. data/lib/config/schema_v4.2.json +7317 -0
  290. data/release_remote.sh +121 -0
  291. data/scripts/README.md +126 -0
  292. data/scripts/cleanup_scripts.sh +73 -0
  293. data/scripts/comprehensive_validation.rb +359 -0
  294. data/scripts/comprehensive_validation_report.json +12 -0
  295. data/scripts/final_validation_report.rb +134 -0
  296. data/scripts/find_deprecated_requests.rb +145 -0
  297. data/scripts/test_request_body_classes.rb +185 -0
  298. data/scripts/validate_requests.rb +192 -0
  299. metadata +241 -34
  300. data/CODE_OF_CONDUCT.md +0 -84
  301. data/lib/app_store_dev_api/requests/v1/app_promoted_purchases/update.rb +0 -16
  302. data/lib/app_store_dev_api/requests/v1/app_store_version_build_linkage_request/update.rb +0 -17
  303. data/lib/app_store_dev_api/requests/v1/build_beta_groups/create.rb +0 -16
  304. data/lib/app_store_dev_api/requests/v1/build_beta_groups/delete.rb +0 -16
  305. data/lib/app_store_dev_api/requests/v1/promoted_purchases_image/create.rb +0 -20
  306. data/lib/app_store_dev_api/requests/v2/sandbox_tester/create.rb +0 -23
  307. data/release.sh +0 -55
data/install_local.bat ADDED
@@ -0,0 +1,166 @@
1
+ @echo off
2
+ rem Windows批处理脚本,用于快速构建和安装当前Ruby gem到本机测试
3
+ chcp 65001 >nul 2>&1
4
+
5
+ setlocal enabledelayedexpansion
6
+
7
+
8
+ rem 获取当前脚本目录
9
+ set "CURRENT_DIR=%~dp0"
10
+ set "CURRENT_DIR=%CURRENT_DIR:~0,-1%"
11
+ echo [LOG] Step 1: Get current directory
12
+ echo 当前目录: %CURRENT_DIR%
13
+
14
+ rem 自动检测当前项目名称
15
+ echo [LOG] Step 2: Detect project name
16
+ set "PROJECT_NAME="
17
+ for %%i in ("%CURRENT_DIR%\*.gemspec") do (
18
+ if exist "%%i" (
19
+ set "GEMSPEC_FILE=%%i"
20
+ for /f %%j in ("%%i") do set "PROJECT_NAME=%%~nj"
21
+ goto :found_gemspec
22
+ )
23
+ )
24
+
25
+ echo [LOG] 错误: 未找到gemspec文件!
26
+ exit /b 1
27
+
28
+ :found_gemspec
29
+ echo [LOG] Step 3: Found project
30
+ echo 检测到项目: %PROJECT_NAME%
31
+
32
+ rem 清理旧的gem文件
33
+ echo [LOG] Step 4: Clean old gem files
34
+ if exist "%CURRENT_DIR%\%PROJECT_NAME%-*.gem" (
35
+ echo 清理旧的gem文件...
36
+ del /q "%CURRENT_DIR%\%PROJECT_NAME%-*.gem"
37
+ )
38
+
39
+ rem 自动检测版本文件
40
+ echo [LOG] Step 5: Detect version file
41
+ set "VERSION_FILE="
42
+ for /r "%CURRENT_DIR%\lib" %%i in (version.rb) do (
43
+ if exist "%%i" (
44
+ set "VERSION_FILE=%%i"
45
+ goto :found_version
46
+ )
47
+ )
48
+
49
+ echo [LOG] 错误: 未找到version.rb文件!
50
+ exit /b 1
51
+
52
+ :found_version
53
+ echo [LOG] Step 6: Found version file
54
+ echo 检测到版本文件: %VERSION_FILE%
55
+
56
+ rem 从version.rb文件提取版本号
57
+ echo [LOG] Step 7: Extract version number
58
+ set "VERSION_TAG_NAME="
59
+ for /f "tokens=*" %%i in ('findstr /r "VERSION.*=" "%VERSION_FILE%"') do (
60
+ set "line=%%i"
61
+ rem 提取引号中的版本号
62
+ for /f "tokens=2 delims='" %%j in ("!line!") do set "VERSION_TAG_NAME=%%j"
63
+ if "!VERSION_TAG_NAME!"=="" (
64
+ for /f "tokens=2 delims=""" %%j in ("!line!") do set "VERSION_TAG_NAME=%%j"
65
+ )
66
+ )
67
+
68
+ if "%VERSION_TAG_NAME%"=="" (
69
+ echo [LOG] 错误: 无法从版本文件中解析版本号
70
+ echo 版本文件内容:
71
+ type "%VERSION_FILE%"
72
+ exit /b 1
73
+ )
74
+
75
+ echo [LOG] Step 8: Version number parsed successfully
76
+ echo 检测到版本: %VERSION_TAG_NAME%
77
+
78
+ rem 验证版本号格式 (基本检查是否包含点号)
79
+ echo %VERSION_TAG_NAME% | findstr "." >nul
80
+ if errorlevel 1 (
81
+ echo 警告: 版本号格式可能不正确: %VERSION_TAG_NAME%
82
+ )
83
+
84
+ rem 构建gem
85
+ echo [LOG] Step 9: Start building gem
86
+ echo 构建 %PROJECT_NAME% gem...
87
+ cd /d "%CURRENT_DIR%"
88
+
89
+ rem 构建gem,忽略警告的退出码
90
+ echo [LOG] Step 10: Execute gem build command
91
+ gem build "%GEMSPEC_FILE%"
92
+ rem 重置错误级别,防止警告阻止脚本继续
93
+ cd .
94
+ echo [LOG] Step 11: gem build command completed, checking result
95
+ echo [DEBUG] Looking for file: %PROJECT_NAME%-%VERSION_TAG_NAME%.gem
96
+
97
+ rem 检查是否生成了gem文件来判断构建是否成功
98
+ if not exist "%PROJECT_NAME%-%VERSION_TAG_NAME%.gem" (
99
+ echo [LOG] 错误: gem构建失败,未找到生成的gem文件!
100
+ echo [DEBUG] 当前目录文件列表:
101
+ dir *.gem
102
+ exit /b 1
103
+ ) else (
104
+ echo [LOG] Step 12: gem build success confirmed
105
+ echo ✓ gem构建成功
106
+ echo.
107
+ echo ==========================================
108
+ echo 构建完成!现在可以安装到本地:
109
+ echo.
110
+ echo 安装命令:
111
+ echo gem install --local --force %PROJECT_NAME%-%VERSION_TAG_NAME%.gem
112
+ echo.
113
+ echo 安装后验证:
114
+ echo %PROJECT_NAME% --version
115
+ echo %PROJECT_NAME% --help
116
+ echo ==========================================
117
+ echo.
118
+ )
119
+
120
+ rem 查找生成的gem文件
121
+ echo [LOG] Step 13: Search for generated gem file
122
+ set "GEM_FILE="
123
+ if exist "%PROJECT_NAME%-%VERSION_TAG_NAME%.gem" (
124
+ set "GEM_FILE=%PROJECT_NAME%-%VERSION_TAG_NAME%.gem"
125
+ ) else (
126
+ rem 尝试查找任何版本的gem文件
127
+ for %%i in ("%PROJECT_NAME%-*.gem") do (
128
+ set "GEM_FILE=%%i"
129
+ goto :found_gem
130
+ )
131
+ )
132
+
133
+ :found_gem
134
+ if "%GEM_FILE%"=="" (
135
+ echo [LOG] 错误: 未找到生成的gem文件!
136
+ exit /b 1
137
+ )
138
+
139
+ echo [LOG] Step 14: Found gem file
140
+ echo 找到gem文件: %GEM_FILE%
141
+ echo [LOG] Step 15: Start installing gem
142
+ echo 安装 %GEM_FILE%...
143
+
144
+ rem 安装gem(使用force参数忽略依赖检查)
145
+ echo [LOG] Step 16: Execute gem install command
146
+ gem install --local --force "%GEM_FILE%"
147
+ echo [LOG] Step 17: gem install command completed
148
+
149
+ if errorlevel 1 (
150
+ echo [LOG] 错误: gem安装失败!
151
+ echo 尝试手动安装: gem install --local --force "%GEM_FILE%"
152
+ exit /b 1
153
+ ) else (
154
+ echo [LOG] Step 18: gem installation successful
155
+ echo ✓ %PROJECT_NAME% 安装成功!
156
+ echo [LOG] Step 19: Verify installed version
157
+ echo 当前版本:
158
+ %PROJECT_NAME% --version
159
+ echo.
160
+ echo 可以使用以下命令测试:
161
+ echo %PROJECT_NAME% --help
162
+ echo %PROJECT_NAME% --version
163
+ echo [LOG] Step 20: Script execution completed
164
+ )
165
+
166
+ pause
data/install_local.sh ADDED
@@ -0,0 +1,84 @@
1
+ #!/bin/bash
2
+ # 简化的本地安装脚本 - 适用于库 gem 项目
3
+
4
+ set -e # 遇到错误立即退出
5
+
6
+ # 获取当前目录
7
+ CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
+ cd "$CURRENT_DIR"
9
+
10
+ echo "=========================================="
11
+ echo "本地构建和安装 Gem"
12
+ echo "=========================================="
13
+ echo
14
+
15
+ # 1. 自动检测项目名称
16
+ GEMSPEC_FILE=$(find . -maxdepth 1 -name "*.gemspec" | head -n 1)
17
+ if [ -z "$GEMSPEC_FILE" ]; then
18
+ echo "❌ 错误: 未找到 .gemspec 文件"
19
+ exit 1
20
+ fi
21
+
22
+ PROJECT_NAME=$(basename "$GEMSPEC_FILE" .gemspec)
23
+ echo "项目: $PROJECT_NAME"
24
+
25
+ # 2. 自动检测版本号
26
+ VERSION_FILE=$(find ./lib -name "version.rb" | head -n 1)
27
+ if [ -z "$VERSION_FILE" ]; then
28
+ echo "❌ 错误: 未找到 version.rb 文件"
29
+ exit 1
30
+ fi
31
+
32
+ # 提取版本号
33
+ VERSION=$(grep -o "VERSION.*=.*['\"][0-9.]*['\"]" "$VERSION_FILE" | sed -E "s/.*['\"]([0-9.]+)['\"].*/\1/")
34
+
35
+ if [ -z "$VERSION" ]; then
36
+ echo "❌ 错误: 无法解析版本号"
37
+ cat "$VERSION_FILE"
38
+ exit 1
39
+ fi
40
+
41
+ echo "版本: $VERSION"
42
+ echo
43
+
44
+ # 3. 清理旧的 gem 文件
45
+ echo "清理旧的 gem 文件..."
46
+ rm -f *.gem
47
+ echo "✓ 清理完成"
48
+ echo
49
+
50
+ # 4. 构建 gem
51
+ echo "构建 gem..."
52
+ gem build "$GEMSPEC_FILE"
53
+
54
+ GEM_FILE="${PROJECT_NAME}-${VERSION}.gem"
55
+
56
+ if [ ! -f "$GEM_FILE" ]; then
57
+ echo "❌ 错误: gem 构建失败,未找到 $GEM_FILE"
58
+ exit 1
59
+ fi
60
+
61
+ echo "✓ 构建成功: $GEM_FILE"
62
+ echo
63
+
64
+ # 5. 安装到本地
65
+ echo "安装到本地..."
66
+ gem install "$GEM_FILE"
67
+
68
+ echo
69
+ echo "=========================================="
70
+ echo "✅ 安装成功!"
71
+ echo "=========================================="
72
+ echo
73
+ echo "使用方法 (Ruby 代码中):"
74
+ echo " require 'app_store_dev_api'"
75
+ echo " client = AppStoreDevApi::Client.new("
76
+ echo " key_id: 'YOUR_KEY_ID',"
77
+ echo " issuer_id: 'YOUR_ISSUER_ID',"
78
+ echo " private_key: File.read('AuthKey.p8')"
79
+ echo " )"
80
+ echo
81
+ echo "验证安装:"
82
+ echo " gem list | grep $PROJECT_NAME"
83
+ echo " ruby -r app_store_dev_api -e 'puts AppStoreDevApi::VERSION'"
84
+ echo "=========================================="
@@ -0,0 +1,84 @@
1
+ #!/bin/bash
2
+ # 简化的本地安装脚本 - 适用于库 gem 项目
3
+
4
+ set -e # 遇到错误立即退出
5
+
6
+ # 获取当前目录
7
+ CURRENT_DIR="$(cd "$(dirname "$0")" && pwd)"
8
+ cd "$CURRENT_DIR"
9
+
10
+ echo "=========================================="
11
+ echo "本地构建和安装 Gem"
12
+ echo "=========================================="
13
+ echo
14
+
15
+ # 1. 自动检测项目名称
16
+ GEMSPEC_FILE=$(find . -maxdepth 1 -name "*.gemspec" | head -n 1)
17
+ if [ -z "$GEMSPEC_FILE" ]; then
18
+ echo "❌ 错误: 未找到 .gemspec 文件"
19
+ exit 1
20
+ fi
21
+
22
+ PROJECT_NAME=$(basename "$GEMSPEC_FILE" .gemspec)
23
+ echo "项目: $PROJECT_NAME"
24
+
25
+ # 2. 自动检测版本号
26
+ VERSION_FILE=$(find ./lib -name "version.rb" | head -n 1)
27
+ if [ -z "$VERSION_FILE" ]; then
28
+ echo "❌ 错误: 未找到 version.rb 文件"
29
+ exit 1
30
+ fi
31
+
32
+ # 提取版本号
33
+ VERSION=$(grep -o "VERSION.*=.*['\"][0-9.]*['\"]" "$VERSION_FILE" | sed -E "s/.*['\"]([0-9.]+)['\"].*/\1/")
34
+
35
+ if [ -z "$VERSION" ]; then
36
+ echo "❌ 错误: 无法解析版本号"
37
+ cat "$VERSION_FILE"
38
+ exit 1
39
+ fi
40
+
41
+ echo "版本: $VERSION"
42
+ echo
43
+
44
+ # 3. 清理旧的 gem 文件
45
+ echo "清理旧的 gem 文件..."
46
+ rm -f *.gem
47
+ echo "✓ 清理完成"
48
+ echo
49
+
50
+ # 4. 构建 gem
51
+ echo "构建 gem..."
52
+ gem build "$GEMSPEC_FILE"
53
+
54
+ GEM_FILE="${PROJECT_NAME}-${VERSION}.gem"
55
+
56
+ if [ ! -f "$GEM_FILE" ]; then
57
+ echo "❌ 错误: gem 构建失败,未找到 $GEM_FILE"
58
+ exit 1
59
+ fi
60
+
61
+ echo "✓ 构建成功: $GEM_FILE"
62
+ echo
63
+
64
+ # 5. 安装到本地
65
+ echo "安装到本地..."
66
+ gem install "$GEM_FILE"
67
+
68
+ echo
69
+ echo "=========================================="
70
+ echo "✅ 安装成功!"
71
+ echo "=========================================="
72
+ echo
73
+ echo "使用方法 (Ruby 代码中):"
74
+ echo " require 'app_store_dev_api'"
75
+ echo " client = AppStoreDevApi::Client.new("
76
+ echo " key_id: 'YOUR_KEY_ID',"
77
+ echo " issuer_id: 'YOUR_ISSUER_ID',"
78
+ echo " private_key: File.read('AuthKey.p8')"
79
+ echo " )"
80
+ echo
81
+ echo "验证安装:"
82
+ echo " gem list | grep $PROJECT_NAME"
83
+ echo " ruby -r app_store_dev_api -e 'puts AppStoreDevApi::VERSION'"
84
+ echo "=========================================="
data/lib/.DS_Store CHANGED
Binary file
@@ -19,15 +19,20 @@ module AppStoreDevApi
19
19
  end
20
20
 
21
21
  def payload
22
+ current_time = Time.now.to_i
22
23
  {
23
- exp: Time.now.to_i + 20 * 60,
24
24
  iss: issuer_id,
25
+ iat: current_time,
26
+ exp: current_time + 20 * 60,
25
27
  aud: AUDIENCE
26
28
  }
27
29
  end
28
30
 
29
31
  def header_fields
30
- { kid: key_id }
32
+ {
33
+ kid: key_id,
34
+ typ: 'JWT'
35
+ }
31
36
  end
32
37
 
33
38
  def token
@@ -1,5 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'json'
4
+ require 'active_support/core_ext/hash'
5
+
6
+ # ⚠️ 注意:此 Builder 类已不再使用
7
+ #
8
+ # Client 现在完全使用动态方法调度(method_missing),无需预生成方法。
9
+ #
10
+ # 此 Builder 类保留用于以下可选场景:
11
+ # 1. IDE 自动补全支持 - 生成方法定义供 IDE 解析
12
+ # 2. 类型检查工具 - 生成方法签名供 Sorbet/Steep 使用
13
+ # 3. 文档生成 - 生成完整的方法列表文档
14
+ #
15
+ # 默认情况下不使用,Client 直接继承 Base 使用动态调度。
16
+ #
17
+ # 如需生成(可选):
18
+ # ruby -r ./lib/app_store_dev_api/client/builder.rb \
19
+ # -e "AppStoreDevApi::Client::Builder.new.write"
20
+ #
21
+ # 生成后的文件:
22
+ # lib/app_store_dev_api/client_generated.rb (不会覆盖 client.rb)
23
+ #
3
24
  module AppStoreDevApi
4
25
  class Client
5
26
  class Builder
@@ -11,6 +32,7 @@ module AppStoreDevApi
11
32
  # This file is generated.
12
33
  #
13
34
  # WARNING ABOUT GENERATED CODE
35
+ #
14
36
 
15
37
  module AppStoreDevApi
16
38
  class Client < Base
@@ -33,46 +55,23 @@ module AppStoreDevApi
33
55
  private_constant :TEMPLATE
34
56
 
35
57
  def web_service_endpoints
36
- [
37
- {
38
- "alias": 'create_certificate',
39
- "http_method": 'post',
40
- "url": 'https://api.appstoreconnect.apple.com/v1/certificates',
41
- "http_body_type": 'Requests::V1::Certificate::Create',
42
- "see": 'https://developer.apple.com/documentation/appstoreconnectapi'
43
- },
44
- {
45
- "http_method": 'delete',
46
- "url": 'https://api.appstoreconnect.apple.com/v1/users/{id}/relationships/visibleApps',
47
- "alias": 'delete_visible_app',
48
- "see": 'https://developer.apple.com/documentation/appstoreconnectapi'
49
- },
50
- {
51
- "alias": 'create_bundle_id',
52
- "url": 'https://api.appstoreconnect.apple.com/v1/bundleIds',
53
- "http_body_type": 'Requests::V1::BundleId::Create',
54
- "http_method": 'post',
55
- "see": 'https://developer.apple.com/documentation/appstoreconnectapi/register_a_new_bundle_id'
56
- },
57
- {
58
- "alias": 'create_bundle_id_capability',
59
- "url": 'https://api.appstoreconnect.apple.com/v1/bundleIdCapabilities',
60
- "http_body_type": 'Requests::V1::BundleIdCapability::Create',
61
- "http_method": 'post',
62
- "see": 'https://developer.apple.com/documentation/appstoreconnectapi'
63
- },
64
- {
65
- "alias": 'create_beta_build_localization',
66
- "url": 'https://api.appstoreconnect.apple.com/v1/betaBuildLocalizations',
67
- "http_body_type": 'Requests::V1::BetaBuildLocalization::Create',
68
- "http_method": 'post',
69
- "see": 'https://developer.apple.com/documentation/appstoreconnectapi'
70
- }
71
- ].map(&:symbolize_keys)
58
+ @web_service_endpoints ||= begin
59
+ schema_content = File.read(schema_path)
60
+ schema = JSON.parse(schema_content)
61
+
62
+ schema['web_service_endpoints'].map do |endpoint|
63
+ endpoint.symbolize_keys.tap do |ep|
64
+ ep[:see] ||= 'https://developer.apple.com/documentation/appstoreconnectapi'
65
+ end
66
+ end
67
+ end
72
68
  end
73
69
 
74
- def write
75
- File.write('lib/app_store_dev_api/client.rb', source)
70
+ def write(output_file = 'lib/app_store_dev_api/client_generated.rb')
71
+ File.write(output_file, source)
72
+ puts "✅ 已生成方法定义到: #{output_file}"
73
+ puts "⚠️ 注意: 这是可选的生成文件,仅用于 IDE 支持"
74
+ puts " 默认使用动态调度,无需此文件"
76
75
  end
77
76
 
78
77
  def source
@@ -86,6 +85,12 @@ module AppStoreDevApi
86
85
 
87
86
  @source
88
87
  end
88
+
89
+ private
90
+
91
+ def schema_path
92
+ File.join(Dir.pwd, 'lib/config/schema_v4.2.json')
93
+ end
89
94
  end
90
95
  end
91
96
  end
@@ -9,7 +9,7 @@ module AppStoreDevApi
9
9
 
10
10
  DEFAULTS = {
11
11
  analytics_enabled: true,
12
- schema: Schema.new(File.join(__dir__, '..', '..', 'config', 'schema.json'))
12
+ schema: Schema.new(File.join(__dir__, '..', '..', 'config', 'schema_v4.2.json'))
13
13
  }.freeze
14
14
  private_constant :DEFAULTS
15
15
 
@@ -1,66 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # WARNING ABOUT GENERATED CODE
4
- #
5
- # This file is generated.
6
- #
7
- # WARNING ABOUT GENERATED CODE
8
-
9
3
  module AppStoreDevApi
4
+ # Client 使用 Base 的 method_missing 机制动态调度所有 API 方法
5
+ # 所有端点配置从 schema.json 加载
6
+ #
7
+ # 用法:
8
+ # client = AppStoreDevApi::Client.new(
9
+ # issuer_id: 'your_issuer_id',
10
+ # key_id: 'your_key_id',
11
+ # private_key: private_key_pem
12
+ # )
13
+ #
14
+ # 所有 API 方法都可用(共 1,210 个方法):
15
+ # client.list_apps
16
+ # client.create_bundle_id(...)
17
+ # client.delete_user(id: 'user_id')
18
+ # client.app_info(id: 'app_id')
19
+ #
20
+ # 查看所有可用方法:
21
+ # client.web_service_endpoint_aliases
22
+ # # => [:create_accessibility_declaration, :list_apps, ...]
23
+ #
24
+ # 检查方法是否存在:
25
+ # client.respond_to?(:list_apps) # => true
26
+ #
27
+ # 方法总数:
28
+ # client.web_service_endpoint_aliases.size # => 1210
29
+ #
30
+ # API 文档:
31
+ # https://developer.apple.com/documentation/appstoreconnectapi
32
+ #
10
33
  class Client < Base
11
- #
12
- # @see https://developer.apple.com/documentation/appstoreconnectapi
13
- #
14
- def create_certificate(**kwargs)
15
- web_service_endpoint = Schema::WebServiceEndpoint.new(
16
- { http_body_type: 'Requests::V1::Certificate::Create', http_method: 'post', url: 'https://api.appstoreconnect.apple.com/v1/certificates' }
17
- )
18
-
19
- call(web_service_endpoint, **kwargs)
20
- end
21
-
22
- #
23
- # @see https://developer.apple.com/documentation/appstoreconnectapi
24
- #
25
- def delete_visible_app(**kwargs)
26
- web_service_endpoint = Schema::WebServiceEndpoint.new(
27
- { http_method: 'delete', url: 'https://api.appstoreconnect.apple.com/v1/users/{id}/relationships/visibleApps' }
28
- )
29
-
30
- call(web_service_endpoint, **kwargs)
31
- end
32
-
33
- #
34
- # @see https://developer.apple.com/documentation/appstoreconnectapi/register_a_new_bundle_id
35
- #
36
- def create_bundle_id(**kwargs)
37
- web_service_endpoint = Schema::WebServiceEndpoint.new(
38
- { http_body_type: 'Requests::V1::BundleId::Create', http_method: 'post', url: 'https://api.appstoreconnect.apple.com/v1/bundleIds' }
39
- )
40
-
41
- call(web_service_endpoint, **kwargs)
42
- end
43
-
44
- #
45
- # @see https://developer.apple.com/documentation/appstoreconnectapi
46
- #
47
- def create_bundle_id_capability(**kwargs)
48
- web_service_endpoint = Schema::WebServiceEndpoint.new(
49
- { http_body_type: 'Requests::V1::BundleIdCapability::Create', http_method: 'post', url: 'https://api.appstoreconnect.apple.com/v1/bundleIdCapabilities' }
50
- )
51
-
52
- call(web_service_endpoint, **kwargs)
53
- end
54
-
55
- #
56
- # @see https://developer.apple.com/documentation/appstoreconnectapi
57
- #
58
- def create_beta_build_localization(**kwargs)
59
- web_service_endpoint = Schema::WebServiceEndpoint.new(
60
- { http_body_type: 'Requests::V1::BetaBuildLocalization::Create', http_method: 'post', url: 'https://api.appstoreconnect.apple.com/v1/betaBuildLocalizations' }
61
- )
62
-
63
- call(web_service_endpoint, **kwargs)
64
- end
34
+ # 所有方法通过 Base#method_missing 动态调度
35
+ # 端点配置从 lib/config/schema_v4.2.json 加载
65
36
  end
66
37
  end
@@ -21,7 +21,7 @@ module AppStoreDevApi
21
21
 
22
22
  attributes.send(:define_method, :initialize) do |**kwargs|
23
23
  self.class.properties.each do |name, options|
24
- raise ArgumentError, "#{name} required" if options[:required] && !kwargs[name]
24
+ raise ArgumentError, "#{name} required" if options[:required] && !kwargs.key?(name)
25
25
 
26
26
  value = kwargs.fetch(name, options[:default])
27
27
 
@@ -13,19 +13,23 @@ module AppStoreDevApi
13
13
  klass = Class.new do |data|
14
14
  include Object::DataType
15
15
  include Object::Attributes
16
+ include Object::Relationships
16
17
  include Object::Type
17
18
  include Object::Id
18
19
 
19
20
  data.send(:define_method, :initialize) do |**kwargs|
20
- instance_variable_set('@relationships', kwargs.delete(:relationships).to_h)
21
+ # 提取 relationships 参数
22
+ relationships_data = kwargs.delete(:relationships) || {}
23
+
21
24
  instance_variable_set('@data', Array(kwargs.delete(:data)))
22
25
  instance_variable_set('@attributes', data::Attributes.new(**kwargs))
26
+ instance_variable_set('@relationships', data::Relationships.new(**relationships_data))
23
27
  instance_variable_set('@id', kwargs[id_arg_name])
24
28
  end
25
29
 
26
30
  def to_h
27
31
  props = {
28
- relationships: @relationships,
32
+ relationships: relationships.to_h,
29
33
  attributes: attributes.to_h,
30
34
  type: type
31
35
  }
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/concern'
4
+
5
+ module AppStoreDevApi
6
+ module Object
7
+ module Relationships
8
+ extend ActiveSupport::Concern
9
+
10
+ class_methods do
11
+ def relationships(&block)
12
+ self::Relationships.class_eval(&block)
13
+ end
14
+ end
15
+
16
+ included do
17
+ attr_reader :relationships
18
+
19
+ klass = Class.new do |relationships|
20
+ include Object::Properties
21
+
22
+ relationships.send(:define_method, :initialize) do |**kwargs|
23
+ self.class.properties.each do |name, options|
24
+ raise ArgumentError, "#{name} required" if options[:required] && !kwargs.key?(name)
25
+
26
+ value = kwargs.fetch(name, options[:default])
27
+
28
+ instance_variable_set("@#{name}", value)
29
+ end
30
+ end
31
+
32
+ def to_h
33
+ {}.tap do |hash|
34
+ self.class.properties.each_key do |name|
35
+ value = instance_variable_get("@#{name}")
36
+
37
+ hash[name] = value unless value.nil?
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ const_set('Relationships', klass)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+ module AppStoreDevApi
2
+ module Requests
3
+ module V1
4
+ module AccessibilityDeclaration
5
+ class Create < Request::Body
6
+ data do
7
+ type 'accessibilityDeclarations'
8
+ attributes do
9
+ property :deviceFamily, required: true
10
+ property :supportsAudioDescriptions
11
+ property :supportsCaptions
12
+ property :supportsDarkInterface
13
+ property :supportsDifferentiateWithoutColorAlone
14
+ property :supportsLargerText
15
+ property :supportsReducedMotion
16
+ property :supportsSufficientContrast
17
+ property :supportsVoiceControl
18
+ property :supportsVoiceover
19
+ end
20
+ relationships do
21
+ property :app, required: true
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end