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/README.md CHANGED
@@ -1,39 +1,231 @@
1
- # AppStoreDevApi
1
+ # App Store Connect API Ruby SDK
2
2
 
3
- TODO: Delete this and the text below, and describe your gem
3
+ 一个用于与 Apple App Store Connect API 交互的 Ruby 客户端库。
4
4
 
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/app_store_dev_api`. To experiment with that code, run `bin/console` for an interactive prompt.
5
+ [![API Version](https://img.shields.io/badge/App%20Store%20Connect%20API-v4.2-blue)](https://developer.apple.com/documentation/appstoreconnectapi)
6
+ [![Ruby](https://img.shields.io/badge/Ruby-2.7+-red)](https://www.ruby-lang.org)
6
7
 
7
- ## Installation
8
+ ## 简介
8
9
 
9
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
+ AppStoreDevApi 是一个功能完整的 Ruby gem,提供了对 Apple App Store Connect API 的便捷访问。该库基于官方 API 文档自动生成代码,确保 API 覆盖的完整性和准确性。
10
11
 
11
- Install the gem and add to the application's Gemfile by executing:
12
+ **🎉 最新更新**:已完全兼容 Apple App Store Connect API v4.2 规范,所有 241 个接口已验证通过(100% 一致性)。
12
13
 
13
- $ bundle add UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
14
+ ## 主要特性
14
15
 
15
- If bundler is not being used to manage dependencies, install the gem by executing:
16
+ - 🔐 **JWT 认证** - 自动处理 JWT token 生成和认证
17
+ - 🚀 **自动代码生成** - 基于官方 API 规范自动生成客户端代码
18
+ - 📦 **完整 API 覆盖** - 完整支持 App Store Connect API v4.2(v1/v2 API)
19
+ - 🛠️ **简单易用** - 提供直观的 Ruby 接口调用 API
20
+ - ✅ **完全验证** - 所有 Request 类已通过 OpenAPI 规范验证
16
21
 
17
- $ gem install UPDATE_WITH_YOUR_GEM_NAME_PRIOR_TO_RELEASE_TO_RUBYGEMS_ORG
22
+ ## 🚀 最近更新
18
23
 
19
- ## Usage
24
+ ### API v4.2 完全兼容 (2026-01)
20
25
 
21
- TODO: Write usage instructions here
26
+ 我们对整个库进行了全面升级,以完全兼容 Apple App Store Connect API v4.2:
22
27
 
23
- ## Development
28
+ **核心改进:**
29
+ - ✅ **68 个接口修复** - 修复所有不一致问题,一致性从 72.2% 提升到 100%
30
+ - ✅ **160+ 新增接口** - 新增大量 API v4.2 功能支持
31
+ - ✅ **命名规范化** - 统一使用驼峰命名(camelCase)
32
+ - ✅ **Bug 修复** - 修复核心对象类中的布尔值验证问题
33
+ - ✅ **完整测试** - 所有 241 个接口通过验证
24
34
 
25
- After checking out the repo, run `bin/console` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
35
+ **新增功能模块:**
36
+ - 🆕 Accessibility Declarations(无障碍声明)
37
+ - 🆕 Webhooks(事件通知)
38
+ - 🆕 Marketplace Search(市场搜索)
39
+ - 🆕 Alternative Distribution(替代分发)
40
+ - 🆕 Background Assets(后台资源)
41
+ - 🆕 Win Back Offers(用户召回优惠)
26
42
 
27
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
43
+ **详细更新日志请查看** [CHANGELOG.md](CHANGELOG.md)
28
44
 
29
- ## Contributing
45
+ ## 支持的 API 模块
30
46
 
31
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/app_store_dev_api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/app_store_dev_api/blob/main/CODE_OF_CONDUCT.md).
47
+ ### 应用管理
48
+ - Apps 基础信息管理
49
+ - App Store Versions 版本管理
50
+ - App Store Version Submissions 提交审核
51
+ - App Store Review Details 审核详情
52
+ - Build 构建管理
32
53
 
33
- ## License
54
+ ### ✅ 媒体资源
55
+ - App Screenshots 应用截图
56
+ - App Previews 应用预览
57
+ - App Event Video Clips 活动视频
34
58
 
35
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
59
+ ### 元数据管理
60
+ - App Info & Localizations 应用信息本地化
61
+ - App Store Version Localizations 版本本地化
62
+ - App Categories 应用分类
63
+ - Age Rating Declarations 年龄分级
64
+
65
+ ### ✅ 测试与分发
66
+ - TestFlight Beta Testing 测试版管理
67
+ - Beta Testers 测试人员管理
68
+ - Beta Groups 测试组管理
69
+ - Pre-Release Versions 预发布版本
36
70
 
37
- ## Code of Conduct
71
+ ### 内购与订阅
72
+ - In-App Purchases 应用内购买
73
+ - Subscriptions 订阅管理
74
+ - Promotional Offers 促销优惠
38
75
 
39
- Everyone interacting in the AppStoreDevApi project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/app_store_dev_api/blob/main/CODE_OF_CONDUCT.md).
76
+ ### 证书与配置
77
+ - Bundle IDs 包标识符
78
+ - Certificates 证书管理
79
+ - Profiles 配置文件
80
+ - Devices 设备管理
81
+
82
+ ### ✅ 用户与权限
83
+ - Users 用户管理
84
+ - User Invitations 用户邀请
85
+ - User Roles 角色权限
86
+
87
+ ### ✅ 报告与分析
88
+ - Sales Reports 销售报告
89
+ - Finance Reports 财务报告
90
+ - Power and Performance Metrics 性能指标
91
+
92
+ ## 安装
93
+
94
+ 添加到你的 Gemfile:
95
+
96
+ ```ruby
97
+ gem 'app_store_dev_api'
98
+ ```
99
+
100
+ 然后执行:
101
+
102
+ ```bash
103
+ bundle install
104
+ ```
105
+
106
+ 或者直接安装:
107
+
108
+ ```bash
109
+ gem install app_store_dev_api
110
+ ```
111
+
112
+ ## 快速开始
113
+
114
+ ### 1. 配置认证
115
+
116
+ ```ruby
117
+ require 'app_store_dev_api'
118
+
119
+ client = AppStoreDevApi::Client.new(
120
+ key_id: 'YOUR_KEY_ID',
121
+ issuer_id: 'YOUR_ISSUER_ID',
122
+ private_key: File.read('path/to/AuthKey_YOUR_KEY_ID.p8')
123
+ )
124
+ ```
125
+
126
+ ### 2. 使用示例
127
+
128
+ ```ruby
129
+ # 获取所有应用
130
+ apps = client.apps
131
+
132
+ # 获取特定应用信息
133
+ app = client.app(id: 'APP_ID')
134
+
135
+ # 创建新版本
136
+ version = client.create_app_store_version(
137
+ attributes: {
138
+ platform: 'IOS',
139
+ versionString: '1.0.1'
140
+ },
141
+ relationships: {
142
+ app: { data: { type: 'apps', id: 'APP_ID' } }
143
+ }
144
+ )
145
+
146
+ # 上传截图
147
+ screenshot = client.create_app_screenshot(
148
+ attributes: {
149
+ fileName: 'screenshot.png',
150
+ fileSize: 102400
151
+ },
152
+ relationships: {
153
+ appScreenshotSet: { data: { type: 'appScreenshotSets', id: 'SET_ID' } }
154
+ }
155
+ )
156
+ ```
157
+
158
+ ## 获取 API 密钥
159
+
160
+ 1. 登录 [App Store Connect](https://appstoreconnect.apple.com)
161
+ 2. 前往「用户和访问」
162
+ 3. 选择「密钥」标签
163
+ 4. 点击「生成 API 密钥」或「+」按钮
164
+ 5. 输入密钥名称并选择访问权限
165
+ 6. 下载 .p8 私钥文件(只能下载一次)
166
+ 7. 记录密钥 ID 和发行者 ID
167
+
168
+ ## 系统要求
169
+
170
+ - Ruby 2.7 或更高版本
171
+ - 有效的 App Store Connect 账号
172
+ - API 访问权限
173
+
174
+ ## 项目结构
175
+
176
+ ```
177
+ lib/
178
+ ├── app_store_dev_api/
179
+ │ ├── client.rb # 主客户端类(自动生成)
180
+ │ ├── base.rb # 基础请求处理
181
+ │ ├── client/
182
+ │ │ ├── authorization.rb # JWT 认证实现
183
+ │ │ └── builder.rb # 代码生成器
184
+ │ ├── requests/ # API 请求定义
185
+ │ │ ├── v1/ # v1 API 请求
186
+ │ │ └── v2/ # v2 API 请求
187
+ │ └── object/ # 数据模型定义
188
+ └── config/
189
+ └── schema.json # API 端点配置
190
+ ```
191
+
192
+ ## 开发
193
+
194
+ 本项目使用自动代码生成系统,基于 `schema.json` 配置文件生成 API 客户端方法。
195
+
196
+ ### 重新生成客户端代码
197
+
198
+ ```bash
199
+ ruby -r ./lib/app_store_dev_api/client/builder.rb -e "AppStoreDevApi::Client::Builder.new.write"
200
+ ```
201
+
202
+ ### 运行测试
203
+
204
+ ```bash
205
+ bundle exec rspec
206
+ ```
207
+
208
+ ### 代码检查
209
+
210
+ ```bash
211
+ bundle exec rubocop
212
+ ```
213
+
214
+ ## 贡献
215
+
216
+ 欢迎提交 Issue 和 Pull Request!
217
+
218
+ ## 许可证
219
+
220
+ MIT License
221
+
222
+ ## 相关链接
223
+
224
+ - [官方 API 文档](https://developer.apple.com/documentation/appstoreconnectapi)
225
+ - [App Store Connect](https://appstoreconnect.apple.com)
226
+ - [GitHub 仓库](https://github.com/wade0317/app_store_dev_api)
227
+ - [Gitee 镜像](https://gitee.com/goodtools/AppStoreApi-Ruby)
228
+
229
+ ---
230
+
231
+ ⚡ 由 Ruby 驱动 | 基于 App Store Connect API 构建
data/Rakefile CHANGED
@@ -1,4 +1,102 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
- task default: %i[]
4
+ require_relative "lib/app_store_dev_api/version"
5
+
6
+ desc "构建并安装 gem 到本地"
7
+ task :install_local do
8
+ version = AppStoreDevApi::VERSION
9
+ gem_name = "app_store_dev_api"
10
+ gem_file = "#{gem_name}-#{version}.gem"
11
+
12
+ puts "=" * 50
13
+ puts "本地构建和安装"
14
+ puts "=" * 50
15
+ puts "项目: #{gem_name}"
16
+ puts "版本: #{version}"
17
+ puts
18
+
19
+ # 清理旧的 gem 文件
20
+ puts "清理旧的 gem 文件..."
21
+ FileList["*.gem"].each { |f| rm f }
22
+
23
+ # 构建 gem
24
+ puts "构建 gem..."
25
+ sh "gem build #{gem_name}.gemspec"
26
+
27
+ # 安装到本地
28
+ if File.exist?(gem_file)
29
+ puts "安装到本地..."
30
+ sh "gem install #{gem_file}"
31
+ puts
32
+ puts "✅ 安装成功!"
33
+ puts
34
+ puts "使用方法:"
35
+ puts " require 'app_store_dev_api'"
36
+ puts " client = AppStoreDevApi::Client.new(...)"
37
+ else
38
+ puts "❌ 错误: 未找到构建的 gem 文件: #{gem_file}"
39
+ exit 1
40
+ end
41
+ end
42
+
43
+ desc "清理构建的 gem 文件"
44
+ task :clean_gems do
45
+ puts "清理所有 .gem 文件..."
46
+ FileList["*.gem"].each do |f|
47
+ rm f
48
+ puts " 删除: #{f}"
49
+ end
50
+ puts "✅ 清理完成"
51
+ end
52
+
53
+ desc "运行所有验证脚本"
54
+ task :validate do
55
+ puts "=" * 50
56
+ puts "运行验证脚本"
57
+ puts "=" * 50
58
+ puts
59
+
60
+ puts "1. API 一致性验证..."
61
+ sh "ruby scripts/validate_requests.rb"
62
+
63
+ puts
64
+ puts "2. 功能测试..."
65
+ sh "ruby scripts/test_request_body_classes.rb"
66
+
67
+ puts
68
+ puts "3. 三方交叉验证..."
69
+ sh "ruby scripts/comprehensive_validation.rb"
70
+
71
+ puts
72
+ puts "4. 检查废弃接口..."
73
+ sh "ruby scripts/find_deprecated_requests.rb"
74
+ end
75
+
76
+ desc "生成最终验证报告"
77
+ task :report do
78
+ sh "ruby scripts/final_validation_report.rb"
79
+ end
80
+
81
+ desc "显示帮助信息"
82
+ task :help do
83
+ puts
84
+ puts "可用的 Rake 任务:"
85
+ puts
86
+ puts " rake build - 构建 gem 包"
87
+ puts " rake install - 构建并安装到系统(Bundler 默认)"
88
+ puts " rake install_local - 构建并安装到本地"
89
+ puts " rake release - 发布到 RubyGems(需要凭据)"
90
+ puts " rake clean_gems - 清理构建的 gem 文件"
91
+ puts " rake validate - 运行所有验证脚本"
92
+ puts " rake report - 生成最终验证报告"
93
+ puts " rake help - 显示此帮助"
94
+ puts
95
+ puts "示例:"
96
+ puts " bundle exec rake build"
97
+ puts " bundle exec rake install_local"
98
+ puts " bundle exec rake validate"
99
+ puts
100
+ end
101
+
102
+ task default: :help
@@ -0,0 +1,261 @@
1
+ # 发布脚本分析报告
2
+
3
+ ## 📋 脚本概览
4
+
5
+ | 脚本 | 用途 | 状态 |
6
+ |------|------|------|
7
+ | `install_local.sh` | 本地构建和安装 gem | ⚠️ 有问题 |
8
+ | `install_local.bat` | Windows 本地安装 | ⚠️ 有问题 |
9
+ | `release_remote.sh` | 发布到 RubyGems | ⚠️ 有问题 |
10
+ | `release.sh` | (已删除) | - |
11
+
12
+ ---
13
+
14
+ ## 🔍 详细分析
15
+
16
+ ### 1. `install_local.sh` - 本地安装脚本
17
+
18
+ **✅ 正确的部分:**
19
+ - 自动检测项目名称(从 .gemspec 文件)
20
+ - 自动检测版本号(从 version.rb)
21
+ - 清理旧的 gem 文件
22
+ - 构建 gem
23
+ - 本地安装 gem
24
+
25
+ **❌ 存在的问题:**
26
+
27
+ #### 问题 1: 假设 gem 有可执行文件
28
+ ```bash
29
+ # 第 78 行
30
+ gem install --local "$GEM_FILE"
31
+
32
+ # 第 158 行 - ❌ 错误
33
+ %PROJECT_NAME% --version # 假设有可执行文件
34
+ ```
35
+
36
+ **实际情况**:`app_store_dev_api` 是一个**库 gem**,没有可执行文件(gemspec 中没有定义 `spec.executables`)。
37
+
38
+ **问题**:脚本会在第 158 行失败,因为没有 `app_store_dev_api` 命令。
39
+
40
+ #### 问题 2: 不必要的权限修改
41
+ ```bash
42
+ # 第 14-18 行
43
+ /bin/chmod -R a+rwx $CURRENT_DIR # ❌ 危险:给所有用户读写执行权限
44
+ /usr/sbin/chown $(whoami) $CURRENT_DIR
45
+ /usr/bin/chgrp admin $CURRENT_DIR
46
+ ```
47
+
48
+ **问题**:
49
+ - `chmod -R a+rwx` 过于宽松,安全风险
50
+ - 大多数项目不需要这些权限修改
51
+ - 不适用于所有 gem 项目
52
+
53
+ #### 问题 3: macOS 特定代码
54
+ ```bash
55
+ # 第 4-8 行
56
+ if [[ "$OSTYPE" == "darwin"* ]]; then
57
+ CURRENT_DIR=$(dirname $(greadlink -f $0 2>/dev/null || readlink -f $0))
58
+ ```
59
+
60
+ **改进建议**:可以简化为 `cd "$(dirname "$0")" && pwd`
61
+
62
+ ---
63
+
64
+ ### 2. `install_local.bat` - Windows 安装脚本
65
+
66
+ **✅ 正确的部分:**
67
+ - 自动检测项目和版本
68
+ - 构建和安装逻辑正确
69
+
70
+ **❌ 存在的问题:**
71
+
72
+ #### 问题 1: 同样假设有可执行文件
73
+ ```batch
74
+ rem 第 158-162 行 - ❌ 错误
75
+ %PROJECT_NAME% --version
76
+ %PROJECT_NAME% --help
77
+ ```
78
+
79
+ **问题**:库 gem 没有可执行文件,这些命令会失败。
80
+
81
+ #### 问题 2: 强制安装参数
82
+ ```batch
83
+ rem 第 146 行
84
+ gem install --local --force "%GEM_FILE%"
85
+ ```
86
+
87
+ **问题**:`--force` 会忽略依赖检查,可能导致依赖问题。
88
+
89
+ ---
90
+
91
+ ### 3. `release_remote.sh` - 远程发布脚本
92
+
93
+ **❌ 严重问题:**
94
+
95
+ #### 问题 1: 自动提交所有更改
96
+ ```bash
97
+ # 第 55-59 行
98
+ if [ -z "$COMMIT_FILE_LIST" ]; then
99
+ echo "没有需要提交的文件!"
100
+ else
101
+ git -C $CURRENT_DIR add -A
102
+ git -C $CURRENT_DIR commit -m "res ${VERSION_TAG_NAME}" # ❌ 糟糕的 commit message
103
+ ```
104
+
105
+ **问题**:
106
+ - 自动 `add -A` 可能提交不应该提交的文件
107
+ - commit message "res 0.1.0" 没有任何描述性
108
+ - 不符合良好的 Git 实践
109
+
110
+ #### 问题 2: 自动分支合并
111
+ ```bash
112
+ # 第 64-79 行
113
+ if [[ "$CODING_BRANCH" == "$RELEASE_BRANCH" ]]; then
114
+ echo "在master分支不需要处理"
115
+ else
116
+ git checkout $RELEASE_BRANCH
117
+ git merge $CODING_BRANCH # ❌ 自动合并可能有冲突
118
+ git push
119
+ git checkout $CODING_BRANCH
120
+ git merge $RELEASE_BRANCH
121
+ git push
122
+ fi
123
+ ```
124
+
125
+ **问题**:
126
+ - 自动合并可能产生冲突
127
+ - 没有处理合并失败的情况
128
+ - 可能破坏分支历史
129
+
130
+ #### 问题 3: 自动删除远程 tag
131
+ ```bash
132
+ # 第 108-123 行
133
+ read -p "存在远程分支,确认要删除远程分支吗?[Y/n]: " DELETE_REMOTE_TAG
134
+ ```
135
+
136
+ **问题**:删除远程 tag 需要非常小心,可能影响其他开发者。
137
+
138
+ #### 问题 4: 自动推送到 RubyGems
139
+ ```bash
140
+ # 第 131 行
141
+ gem push $CURRENT_DIR/${PROJECT_NAME}-${VERSION_TAG_NAME}.gem
142
+ ```
143
+
144
+ **问题**:
145
+ - 没有检查是否配置了 RubyGems 凭据
146
+ - 没有最终确认步骤
147
+ - 一旦推送无法撤销
148
+
149
+ ---
150
+
151
+ ## 🎯 是否适用于所有 Ruby gem 项目?
152
+
153
+ ### ❌ 不通用,原因:
154
+
155
+ 1. **假设有可执行文件** - 只适用于 CLI 工具类 gem,不适用于库 gem
156
+ 2. **权限修改逻辑** - 不是所有项目都需要
157
+ 3. **自动化程度过高** - release_remote.sh 自动执行太多操作,缺少安全检查
158
+ 4. **分支合并策略** - 假设特定的 Git 工作流
159
+ 5. **commit message 质量差** - "res 0.1.0" 不够描述性
160
+
161
+ ---
162
+
163
+ ## ✅ 推荐方案
164
+
165
+ ### 方案 A: 使用 Rake 任务(标准 Ruby 实践)
166
+
167
+ 创建 `Rakefile` 任务:
168
+
169
+ ```ruby
170
+ # Rakefile
171
+ require "bundler/gem_tasks"
172
+
173
+ desc "Build and install gem locally"
174
+ task :install_local do
175
+ sh "gem build app_store_dev_api.gemspec"
176
+ version = AppStoreDevApi::VERSION
177
+ sh "gem install app_store_dev_api-#{version}.gem"
178
+ end
179
+
180
+ desc "Clean built gems"
181
+ task :clean do
182
+ sh "rm -f *.gem"
183
+ end
184
+ ```
185
+
186
+ **使用方法**:
187
+ ```bash
188
+ bundle exec rake build # 构建 gem
189
+ bundle exec rake install # 安装到本地
190
+ bundle exec rake release # 发布到 RubyGems(需要凭据)
191
+ ```
192
+
193
+ ### 方案 B: 简化脚本(针对库 gem)
194
+
195
+ 创建简单的 `install_local_simple.sh`:
196
+
197
+ ```bash
198
+ #!/bin/bash
199
+
200
+ set -e # 遇到错误立即退出
201
+
202
+ # 检测项目信息
203
+ GEMSPEC=$(ls *.gemspec | head -n 1)
204
+ PROJECT_NAME=$(basename "$GEMSPEC" .gemspec)
205
+ VERSION=$(ruby -r "./lib/${PROJECT_NAME}/version.rb" -e "puts ${PROJECT_NAME^}::VERSION" 2>/dev/null)
206
+
207
+ echo "项目: $PROJECT_NAME"
208
+ echo "版本: $VERSION"
209
+
210
+ # 清理旧 gem
211
+ rm -f *.gem
212
+
213
+ # 构建
214
+ echo "构建 gem..."
215
+ gem build "$GEMSPEC"
216
+
217
+ # 安装
218
+ echo "安装到本地..."
219
+ gem install "${PROJECT_NAME}-${VERSION}.gem"
220
+
221
+ echo "✅ 安装成功!"
222
+ echo
223
+ echo "使用方法:"
224
+ echo " require 'app_store_dev_api'"
225
+ echo " client = AppStoreDevApi::Client.new(...)"
226
+ ```
227
+
228
+ ### 方案 C: 修复现有脚本
229
+
230
+ 只需修复验证部分,移除假设有可执行文件的代码。
231
+
232
+ ---
233
+
234
+ ## 💡 建议
235
+
236
+ ### 推荐方案:**方案 A + 方案 B**
237
+
238
+ 1. **优先使用 Rake 任务**(标准做法)
239
+ - `bundle exec rake build` - 构建
240
+ - `bundle exec rake install` - 本地安装
241
+ - `bundle exec rake release` - 发布
242
+
243
+ 2. **保留简化的 shell 脚本**(便利性)
244
+ - 创建简单的 `install_local_simple.sh`
245
+ - 删除复杂的 `release_remote.sh`
246
+
247
+ 3. **删除有问题的脚本**
248
+ - 删除 `install_local.bat`(Windows 用户可以用 PowerShell + Rake)
249
+ - 删除 `release_remote.sh`(太复杂且不安全)
250
+
251
+ ---
252
+
253
+ ## 🚨 关键问题总结
254
+
255
+ | 脚本 | 主要问题 | 严重程度 | 通用性 |
256
+ |------|----------|----------|--------|
257
+ | `install_local.sh` | 假设有可执行文件、过度权限修改 | 中 | ❌ 低 |
258
+ | `install_local.bat` | 假设有可执行文件、强制安装 | 中 | ❌ 低 |
259
+ | `release_remote.sh` | 自动提交、自动合并、糟糕的 commit message | 高 | ❌ 很低 |
260
+
261
+ **结论**:这些脚本**不适合**作为通用的 Ruby gem 工具,需要重构或替换。