app_store_dev_api 0.1.8 → 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/.gitignore +0 -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/app_store_dev_api.gemspec +5 -6
- 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/.DS_Store +0 -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_availability/{update.rb → delete.rb} +3 -3
- 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/build_beta_notification/create.rb +22 -0
- 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 +20 -0
- 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/marketplace_webhook/create.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/marketplace_webhook/update.rb +22 -0
- data/lib/app_store_dev_api/requests/v1/{in_app_purchase_territory → merchant_id}/create.rb +6 -3
- 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_purchases → promoted_purchase}/create.rb +11 -3
- 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 -18
- data/lib/app_store_dev_api/requests/v1/subscription/update.rb +19 -18
- 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/territory_availability/update.rb +22 -0
- 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/{subscription_price_change_consent_reason → webhook_ping}/create.rb +6 -6
- 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/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v2/app_availability/create.rb +20 -0
- 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 -18
- data/lib/app_store_dev_api/requests/v2/in_app_purchase/update.rb +12 -16
- 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} +1195 -49
- 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 +272 -77
- data/1.txt +0 -457
- data/CODE_OF_CONDUCT.md +0 -84
- data/lib/app_store_dev_api/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app_availability/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app_info/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app_price_schedule/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app_promoted_purchases/.DS_Store +0 -0
- 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/.DS_Store +0 -0
- 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/app_store_version_promotion/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/app_store_version_releases_request/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/beta_build_localization/.DS_Store +0 -0
- 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/builds/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/customer_review_response/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/in_app_purchase_territory/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/profile/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/promoted_purchases_image/create.rb +0 -20
- data/lib/app_store_dev_api/requests/v1/review_submission/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/review_submission_item/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_availability/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_grace_period/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_group_submission/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_price/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_price_change_consent_reason/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v1/subscription_submission/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v2/sandbox_tester/.DS_Store +0 -0
- data/lib/app_store_dev_api/requests/v2/sandbox_tester/create.rb +0 -23
- data/lib/app_store_dev_api/requests/v2/sandbox_tester_clear_purchase_history/.DS_Store +0 -0
- data/release.sh +0 -100
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 工具,需要重构或替换。
|
data/app_store_dev_api.gemspec
CHANGED
|
@@ -31,12 +31,11 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
spec.add_runtime_dependency 'activesupport', '~> 7.0'
|
|
35
|
+
spec.add_runtime_dependency 'jwt', '~> 2.0', '>= 2.0.0'
|
|
36
|
+
spec.add_runtime_dependency 'zeitwerk', '~> 2.6'
|
|
34
37
|
|
|
35
|
-
spec.
|
|
36
|
-
spec.add_runtime_dependency 'jwt', '>= 1.4'
|
|
37
|
-
spec.add_runtime_dependency 'zeitwerk', '>= 2.6.12'
|
|
38
|
-
|
|
39
|
-
spec.add_development_dependency 'bundler'
|
|
38
|
+
spec.add_development_dependency 'bundler', '~> 2.4', '>= 2.4.0'
|
|
40
39
|
spec.add_development_dependency 'erb', '~> 4.0.2'
|
|
41
40
|
spec.add_development_dependency 'factory_bot', '~> 6.2.1'
|
|
42
41
|
spec.add_development_dependency 'github_changelog_generator', '1.16.4'
|
|
@@ -45,7 +44,7 @@ Gem::Specification.new do |spec|
|
|
|
45
44
|
spec.add_development_dependency 'rake', '~> 13.0.6'
|
|
46
45
|
spec.add_development_dependency 'rspec', '~> 3.12.0'
|
|
47
46
|
spec.add_development_dependency 'rubocop', '~> 1.56.4'
|
|
48
|
-
spec.add_development_dependency 'rubyzip'
|
|
47
|
+
spec.add_development_dependency 'rubyzip', '~> 2.3'
|
|
49
48
|
spec.add_development_dependency 'semantic', '~> 1.6.1'
|
|
50
49
|
spec.add_development_dependency 'simplecov', '~> 0.22.0'
|
|
51
50
|
spec.add_development_dependency 'timecop', '~> 0.9.8'
|