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.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/.claude/settings.local.json +40 -0
- data/CHANGELOG.md +59 -2
- data/CLAUDE.md +256 -0
- data/Gemfile.lock +29 -20
- data/README.md +212 -20
- data/Rakefile +99 -1
- data/SCRIPTS_ANALYSIS.md +261 -0
- data/docs/openapi.oas4.2.json +231546 -0
- data/install_local.bat +166 -0
- data/install_local.sh +84 -0
- data/install_local_fixed.sh +84 -0
- data/lib/.DS_Store +0 -0
- data/lib/app_store_dev_api/client/authorization.rb +7 -2
- data/lib/app_store_dev_api/client/builder.rb +43 -38
- data/lib/app_store_dev_api/client/options.rb +1 -1
- data/lib/app_store_dev_api/client.rb +31 -60
- data/lib/app_store_dev_api/object/attributes.rb +1 -1
- data/lib/app_store_dev_api/object/data.rb +6 -2
- data/lib/app_store_dev_api/object/relationships.rb +47 -0
- data/lib/app_store_dev_api/requests/v1/accessibility_declaration/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/accessibility_declaration/update.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/age_rating_declaration/update.rb +43 -0
- data/lib/app_store_dev_api/requests/v1/alternative_distribution_domain/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/alternative_distribution_key/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/alternative_distribution_package/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/analytics_report_request/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/android_to_ios_app_mapping_detail/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app/update.rb +18 -20
- data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/create.rb +32 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience/update.rb +32 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_advanced_experience_image/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_app_store_review_detail/create.rb +19 -0
- data/lib/app_store_dev_api/requests/v1/{builds → app_clip_app_store_review_detail}/update.rb +4 -5
- data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_default_experience/update.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_default_experience_localization/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_header_image/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_clip_header_image/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page_localization/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_custom_product_page_version/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_encryption_declaration/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/app_encryption_declaration_document/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_event/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_event/update.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/app_event_localization/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/app_event_localization/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/app_event_screenshot/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/app_event_screenshot/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_event_video_clip/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/{promoted_purchases_image → app_event_video_clip}/update.rb +4 -4
- data/lib/app_store_dev_api/requests/v1/app_info/update.rb +15 -18
- data/lib/app_store_dev_api/requests/v1/app_info_localization/create.rb +17 -17
- data/lib/app_store_dev_api/requests/v1/app_info_localization/update.rb +14 -18
- data/lib/app_store_dev_api/requests/v1/app_preview/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_preview/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_preview_set/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/app_preview_set/replace_app_previews_linkage.rb +19 -0
- data/lib/app_store_dev_api/requests/v1/app_price_schedule/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/app_screenshot/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/app_screenshot/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_screenshot_set/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/app_screenshot_set/replace_app_screenshots_linkage.rb +19 -0
- data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/create.rb +20 -0
- data/lib/app_store_dev_api/requests/v1/app_store_review_attachment/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/app_store_review_detail/create.rb +19 -20
- data/lib/app_store_dev_api/requests/v1/app_store_review_detail/update.rb +17 -18
- data/lib/app_store_dev_api/requests/v1/app_store_version/create.rb +20 -16
- data/lib/app_store_dev_api/requests/v1/app_store_version/update.rb +20 -18
- data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_experiment/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_experiment_treatment_localization/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_localization/create.rb +18 -18
- data/lib/app_store_dev_api/requests/v1/app_store_version_localization/update.rb +15 -18
- data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/create.rb +7 -2
- data/lib/app_store_dev_api/requests/v1/{app_store_version_phased_releases → app_store_version_phased_release}/update.rb +2 -2
- data/lib/app_store_dev_api/requests/v1/app_store_version_promotion/create.rb +10 -13
- data/lib/app_store_dev_api/requests/v1/{app_store_version_releases_request → app_store_version_release_request}/create.rb +5 -3
- data/lib/app_store_dev_api/requests/v1/app_tag/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/background_asset/create.rb +19 -0
- data/lib/app_store_dev_api/requests/v1/background_asset/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/background_asset_upload_file/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/background_asset_version/create.rb +16 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_clip_invocation_localization/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_localization/create.rb +30 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_localization/update.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_review_detail/update.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/beta_app_review_submission/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/beta_build_localization/create.rb +18 -18
- data/lib/app_store_dev_api/requests/v1/beta_build_localization/update.rb +15 -20
- data/lib/app_store_dev_api/requests/v1/beta_group/create.rb +33 -0
- data/lib/app_store_dev_api/requests/v1/beta_group/update.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/beta_license_agreement/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/beta_recruitment_criterion/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/beta_tester/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/beta_tester_invitation/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/build_beta_detail/update.rb +10 -13
- data/lib/app_store_dev_api/requests/v1/{subscription_price_change_consent_reason → build_beta_notification}/create.rb +8 -2
- data/lib/app_store_dev_api/requests/v1/build_upload/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/build_upload_file/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/build_upload_file/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/bundle_id/create.rb +12 -15
- data/lib/app_store_dev_api/requests/v1/bundle_id/update.rb +20 -0
- data/lib/app_store_dev_api/requests/v1/bundle_id_capability/create.rb +13 -16
- data/lib/app_store_dev_api/requests/v1/bundle_id_capability/update.rb +18 -0
- data/lib/app_store_dev_api/requests/v1/certificate/create.rb +14 -15
- data/lib/app_store_dev_api/requests/v1/certificate/update.rb +17 -0
- data/lib/app_store_dev_api/requests/v1/ci_build_run/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/ci_workflow/create.rb +41 -0
- data/lib/app_store_dev_api/requests/v1/ci_workflow/update.rb +39 -0
- data/lib/app_store_dev_api/requests/v1/customer_review_response_v1/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/device/update.rb +18 -0
- data/lib/app_store_dev_api/requests/v1/end_app_availability_pre_order/create.rb +16 -0
- data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/end_user_license_agreement/update.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement/create.rb +31 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement/update.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement_localization/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_achievement_release/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity/create.rb +32 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity/update.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_image/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_localization/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_version/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_version/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_activity_version_release/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_app_version/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_app_version/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge/create.rb +31 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge/update.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_localization/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_version/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_challenge_version_release/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → game_center_detail}/create.rb +9 -4
- data/lib/app_store_dev_api/requests/v1/game_center_detail/update.rb +29 -0
- data/lib/app_store_dev_api/requests/v1/{customer_review_response → game_center_group}/create.rb +6 -4
- data/lib/app_store_dev_api/requests/v1/game_center_group/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/create.rb +38 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard/update.rb +32 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_entry_submission/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/create.rb +30 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_localization/update.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_release/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_localization/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_member_localization/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/game_center_leaderboard_set_release/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_queue/update.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/create.rb +29 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_rule_set_test/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/game_center_matchmaking_team/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/game_center_player_achievement_submission/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/create.rb +9 -3
- data/lib/app_store_dev_api/requests/v1/{in_app_purchase_review_screenshot → in_app_purchase_app_store_review_screenshot}/update.rb +4 -3
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_availability/create.rb +13 -12
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_image/update.rb +18 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_localization/create.rb +14 -14
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_custom_code/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_offer_code_one_time_use_code/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_price_schedule/create.rb +11 -10
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_submission/create.rb +9 -10
- data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/create.rb +25 -0
- data/lib/app_store_dev_api/requests/v1/marketplace_search_detail/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/{promoted_purchases → marketplace_webhook}/create.rb +7 -5
- data/lib/app_store_dev_api/requests/v1/marketplace_webhook/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/merchant_id/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/{app_price_schedule → merchant_id}/update.rb +7 -3
- data/lib/app_store_dev_api/requests/v1/nomination/create.rb +39 -0
- data/lib/app_store_dev_api/requests/v1/nomination/update.rb +40 -0
- data/lib/app_store_dev_api/requests/v1/pass_type_id/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/pass_type_id/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/profile/create.rb +14 -23
- data/lib/app_store_dev_api/requests/v1/promoted_purchase/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v1/{promoted_purchases → promoted_purchase}/update.rb +4 -3
- data/lib/app_store_dev_api/requests/v1/review_submission/create.rb +11 -7
- data/lib/app_store_dev_api/requests/v1/review_submission/update.rb +12 -15
- data/lib/app_store_dev_api/requests/v1/review_submission_item/create.rb +20 -8
- data/lib/app_store_dev_api/requests/v1/review_submission_item/update.rb +18 -0
- data/lib/app_store_dev_api/requests/v1/routing_app_coverage/create.rb +24 -0
- data/lib/app_store_dev_api/requests/v1/routing_app_coverage/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/subscription/create.rb +17 -17
- data/lib/app_store_dev_api/requests/v1/subscription/update.rb +19 -17
- data/lib/app_store_dev_api/requests/v1/subscription_app_store_review_screenshot/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v1/{subscription_review_screenshot → subscription_app_store_review_screenshot}/update.rb +4 -3
- data/lib/app_store_dev_api/requests/v1/subscription_availability/create.rb +13 -12
- data/lib/app_store_dev_api/requests/v1/subscription_grace_period/update.rb +13 -16
- data/lib/app_store_dev_api/requests/v1/subscription_group/create.rb +12 -13
- data/lib/app_store_dev_api/requests/v1/subscription_group/update.rb +10 -14
- data/lib/app_store_dev_api/requests/v1/subscription_group_localization/create.rb +14 -16
- data/lib/app_store_dev_api/requests/v1/subscription_group_localization/update.rb +11 -16
- data/lib/app_store_dev_api/requests/v1/subscription_group_submission/create.rb +9 -10
- data/lib/app_store_dev_api/requests/v1/subscription_image/create.rb +20 -0
- data/lib/app_store_dev_api/requests/v1/subscription_image/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/create.rb +18 -18
- data/lib/app_store_dev_api/requests/v1/subscription_introductory_offer/update.rb +10 -15
- data/lib/app_store_dev_api/requests/v1/subscription_localization/create.rb +14 -16
- data/lib/app_store_dev_api/requests/v1/subscription_offer_code/create.rb +19 -19
- data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/create.rb +9 -5
- data/lib/app_store_dev_api/requests/v1/{subscription_offer_code_cunstom_code → subscription_offer_code_custom_code}/update.rb +2 -3
- data/lib/app_store_dev_api/requests/v1/subscription_offer_code_one_time_use_code/create.rb +14 -15
- data/lib/app_store_dev_api/requests/v1/subscription_price/create.rb +15 -13
- data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/create.rb +17 -18
- data/lib/app_store_dev_api/requests/v1/subscription_promotional_offer/update.rb +10 -12
- data/lib/app_store_dev_api/requests/v1/subscription_submission/create.rb +9 -8
- data/lib/app_store_dev_api/requests/v1/{app_availability → territory_availability}/update.rb +4 -7
- data/lib/app_store_dev_api/requests/v1/user/update.rb +27 -0
- data/lib/app_store_dev_api/requests/v1/user_invitation/create.rb +30 -0
- data/lib/app_store_dev_api/requests/v1/webhook/create.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/webhook/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v1/webhook_delivery/create.rb +16 -0
- data/lib/app_store_dev_api/requests/v1/webhook_ping/create.rb +16 -0
- data/lib/app_store_dev_api/requests/v1/win_back_offer/create.rb +31 -0
- data/lib/app_store_dev_api/requests/v1/win_back_offer/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v1/win_back_offer/update_prices_linkages.rb +18 -0
- data/lib/app_store_dev_api/requests/v2/app_availability/create.rb +13 -14
- data/lib/app_store_dev_api/requests/v2/app_availability_v2/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/create.rb +27 -0
- data/lib/app_store_dev_api/requests/v2/app_store_version_experiment_v2/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_image_v2/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/create.rb +28 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_localization_v2/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/create.rb +32 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_v2/update.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/game_center_achievement_version_v2/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_image_v2/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/create.rb +30 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_localization_v2/update.rb +25 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_image_v2/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/create.rb +26 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_localization_v2/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/create.rb +29 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_v2/update.rb +21 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_set_version_v2/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/create.rb +39 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_v2/update.rb +32 -0
- data/lib/app_store_dev_api/requests/v2/game_center_leaderboard_version_v2/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v2/in_app_purchase/create.rb +16 -17
- data/lib/app_store_dev_api/requests/v2/in_app_purchase/update.rb +12 -15
- data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/create.rb +29 -0
- data/lib/app_store_dev_api/requests/v2/in_app_purchase_v2/update.rb +23 -0
- data/lib/app_store_dev_api/requests/v2/{sandbox_tester → sandbox_tester_v2}/update.rb +5 -4
- 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
- data/lib/app_store_dev_api/version.rb +1 -1
- data/lib/config/{schema.json → schema_backup.json} +1185 -51
- data/lib/config/schema_v4.2.json +7317 -0
- data/release_remote.sh +121 -0
- data/scripts/README.md +126 -0
- data/scripts/cleanup_scripts.sh +73 -0
- data/scripts/comprehensive_validation.rb +359 -0
- data/scripts/comprehensive_validation_report.json +12 -0
- data/scripts/final_validation_report.rb +134 -0
- data/scripts/find_deprecated_requests.rb +145 -0
- data/scripts/test_request_body_classes.rb +185 -0
- data/scripts/validate_requests.rb +192 -0
- metadata +241 -34
- data/CODE_OF_CONDUCT.md +0 -84
- data/lib/app_store_dev_api/requests/v1/app_promoted_purchases/update.rb +0 -16
- data/lib/app_store_dev_api/requests/v1/app_store_version_build_linkage_request/update.rb +0 -17
- data/lib/app_store_dev_api/requests/v1/build_beta_groups/create.rb +0 -16
- data/lib/app_store_dev_api/requests/v1/build_beta_groups/delete.rb +0 -16
- data/lib/app_store_dev_api/requests/v1/promoted_purchases_image/create.rb +0 -20
- data/lib/app_store_dev_api/requests/v2/sandbox_tester/create.rb +0 -23
- data/release.sh +0 -55
data/README.md
CHANGED
|
@@ -1,39 +1,231 @@
|
|
|
1
|
-
#
|
|
1
|
+
# App Store Connect API Ruby SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个用于与 Apple App Store Connect API 交互的 Ruby 客户端库。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://developer.apple.com/documentation/appstoreconnectapi)
|
|
6
|
+
[](https://www.ruby-lang.org)
|
|
6
7
|
|
|
7
|
-
##
|
|
8
|
+
## 简介
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
AppStoreDevApi 是一个功能完整的 Ruby gem,提供了对 Apple App Store Connect API 的便捷访问。该库基于官方 API 文档自动生成代码,确保 API 覆盖的完整性和准确性。
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
**🎉 最新更新**:已完全兼容 Apple App Store Connect API v4.2 规范,所有 241 个接口已验证通过(100% 一致性)。
|
|
12
13
|
|
|
13
|
-
|
|
14
|
+
## 主要特性
|
|
14
15
|
|
|
15
|
-
|
|
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
|
-
|
|
22
|
+
## 🚀 最近更新
|
|
18
23
|
|
|
19
|
-
|
|
24
|
+
### API v4.2 完全兼容 (2026-01)
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
我们对整个库进行了全面升级,以完全兼容 Apple App Store Connect API v4.2:
|
|
22
27
|
|
|
23
|
-
|
|
28
|
+
**核心改进:**
|
|
29
|
+
- ✅ **68 个接口修复** - 修复所有不一致问题,一致性从 72.2% 提升到 100%
|
|
30
|
+
- ✅ **160+ 新增接口** - 新增大量 API v4.2 功能支持
|
|
31
|
+
- ✅ **命名规范化** - 统一使用驼峰命名(camelCase)
|
|
32
|
+
- ✅ **Bug 修复** - 修复核心对象类中的布尔值验证问题
|
|
33
|
+
- ✅ **完整测试** - 所有 241 个接口通过验证
|
|
24
34
|
|
|
25
|
-
|
|
35
|
+
**新增功能模块:**
|
|
36
|
+
- 🆕 Accessibility Declarations(无障碍声明)
|
|
37
|
+
- 🆕 Webhooks(事件通知)
|
|
38
|
+
- 🆕 Marketplace Search(市场搜索)
|
|
39
|
+
- 🆕 Alternative Distribution(替代分发)
|
|
40
|
+
- 🆕 Background Assets(后台资源)
|
|
41
|
+
- 🆕 Win Back Offers(用户召回优惠)
|
|
26
42
|
|
|
27
|
-
|
|
43
|
+
**详细更新日志请查看** [CHANGELOG.md](CHANGELOG.md)
|
|
28
44
|
|
|
29
|
-
##
|
|
45
|
+
## 支持的 API 模块
|
|
30
46
|
|
|
31
|
-
|
|
47
|
+
### ✅ 应用管理
|
|
48
|
+
- Apps 基础信息管理
|
|
49
|
+
- App Store Versions 版本管理
|
|
50
|
+
- App Store Version Submissions 提交审核
|
|
51
|
+
- App Store Review Details 审核详情
|
|
52
|
+
- Build 构建管理
|
|
32
53
|
|
|
33
|
-
|
|
54
|
+
### ✅ 媒体资源
|
|
55
|
+
- App Screenshots 应用截图
|
|
56
|
+
- App Previews 应用预览
|
|
57
|
+
- App Event Video Clips 活动视频
|
|
34
58
|
|
|
35
|
-
|
|
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
|
-
|
|
71
|
+
### ✅ 内购与订阅
|
|
72
|
+
- In-App Purchases 应用内购买
|
|
73
|
+
- Subscriptions 订阅管理
|
|
74
|
+
- Promotional Offers 促销优惠
|
|
38
75
|
|
|
39
|
-
|
|
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
|
-
|
|
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
|
data/SCRIPTS_ANALYSIS.md
ADDED
|
@@ -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 工具,需要重构或替换。
|