codemagic-cli-tools 0.47.4__tar.gz → 0.48.0__tar.gz
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.
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/PKG-INFO +1 -1
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/pyproject.toml +1 -1
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py +1 -1
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py-e +1 -1
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/resource_manager.py +2 -7
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submissions.py +9 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/error_response.py +19 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/simulator.py +3 -7
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/abstract_base_action.py +1 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_versions_action_group.py +34 -0
- codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +123 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/review_submissions_actions_group.py +20 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/arguments.py +18 -0
- codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/errors.py +15 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_manager_mixin.py +32 -7
- codemagic_cli_tools-0.48.0/src/codemagic/utilities/case_conversion.py +9 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_resource_manager.py +0 -17
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/conftest.py +6 -0
- codemagic_cli_tools-0.48.0/tests/apple/resources/mocks/error_response_entity_state_invalid.json +47 -0
- codemagic_cli_tools-0.48.0/tests/apple/resources/test_error_response.py +22 -0
- codemagic_cli_tools-0.48.0/tests/utilities/test_case_conversion.py +37 -0
- codemagic_cli_tools-0.47.4/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +0 -49
- codemagic_cli_tools-0.47.4/src/codemagic/tools/_app_store_connect/errors.py +0 -5
- codemagic_cli_tools-0.47.4/tests/apple/resources/test_error_response.py +0 -13
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/LICENSE +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/README.md +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_error.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_session.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/apps.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/builds.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/json_web_token_manager.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_id_capabilities.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_ids.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/devices.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/profiles.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/signing_certificates.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/beta_groups.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/type_declarations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_localizations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_version_submissions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_versions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_app_review_submissions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/pre_release_versions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submission_items.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_localization.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_submission.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_localization.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_detail.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_submission.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_build_localization.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build_beta_detail.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id_capability.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/device.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/enums.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/pre_release_version.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/profile.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission_item.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/signing_certificate.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/action_callable.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_formatter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_parser_builder.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_properties.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/common_argument_types.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/typed_cli_argument.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_app.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_help_formatter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process_stream.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_types.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/colors.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/environment.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/data/jars/bundletool-all-1.13.1.jar +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/errors.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/google_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/acting_manager_mixin.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/listing_manager_mixin.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/release_manager.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/resource_manager.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/app_identifier.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/resource_identifier.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release_notes.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_error.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/edit.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/enums.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/track.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/path_finder.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/running_cli_app.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/str_converter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool_result.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/enums.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/android_signing_info.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/abstract_package.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/ipa.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/macos_package.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/bundle_id_detector.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_attributes.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_p12_exporter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_sign_entitlements.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_signing_settings_manager.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/enums.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/export_options.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/json_serializable.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/definitions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/printer.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/keystore.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/pbx_project.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/private_key.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/provisioning_profile.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/core_simulator_service.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/runtime.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/line.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/table.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcode.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcodebuild.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcpretty.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/collector.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/converter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresult.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresulttool.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/py.typed +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/scripts/code_signing_manager.rb +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/abstract_shell_tool.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/keytool.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_localizations_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/app_store_version_submissions_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/apps_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_app_review_submissions_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_build_localizations_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/beta_groups_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/builds_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/publish_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_printer.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/arguments.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_app_bundle.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__main__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/android_keystore.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/arguments.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/app_store_connect.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/codemagic_cli_tools.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__main__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/firebase_action_groups.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/releases_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/get_latest_build_version_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/arguments.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/errors.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/resource_printer.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/git_changelog.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__main__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/google_play_action_groups.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/tracks_action_group.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/get_latest_build_number_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/arguments.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/errors.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play_base_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/keychain.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/universal_apk_generator.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/xcode_project.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/base_auditor.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/exception_auditor.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/http_request_auditor.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/backwards_file_reader.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/decorators.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/levenshtein_distance.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/log.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/versions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/test_apps.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/test_builds.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_id_capabilities.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_ids.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_devices.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_profiles.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_signing_certificates.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/resource_manager_test_base.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_session.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_json_web_token_manager.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/test_beta_groups.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_localizations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_version_submissions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_versions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_app_review_submissions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_pre_release_versions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submission_items.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submissions.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_certificate_type.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_profile_type.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/app_store_version.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/build.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id_capability.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/certificate.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/device.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response_with_links.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/mock_resource.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/pre_release_version.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/profile.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_app_store_version_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_build_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_capability_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_device_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_pre_release_version_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_profile_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_signing_certificate_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_undefined_resource_fields.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_bounded_number.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_iso_8601_datetime.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_maybe_dir.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/argument/test_argument.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/mocks/utf-8-sample.txt +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/test_cli_process.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/cli/test_decorators.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/test_firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google/test_live_firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/edit.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/track.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_edit_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_resource_print.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_track_resource.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/google_play/test_api_client.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mixins/test_string_converter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/certificate.asn1 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem.pub +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem.pub +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_auth.txt +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_other.txt +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_upload_success.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_validation_failure.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_result.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_retrying.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/enums/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/enums/test_resource_enum.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/mocks/testsuite.xml +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/junit/test_xml_generation.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate-no-password.p12 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate.p12 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/codemagic_io_wildcard_development.mobileprovision +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/export_options.plist +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.ipa +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.xcarchive/Products/Applications/Capybara App.app/Capybara App +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_0_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_1_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_2_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_openssh_private_key +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_rsa_private_key +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_xcode/Contents/version.plist +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/devices.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/simulator.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_runtime.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_simulator.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate_attributes.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_code_sign_entitlements.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_export_options.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_private_key.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_provisioning_profile.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_table.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/test_xcode.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_1NtPgUPcB1A83X977l5Q91ElstUeVDnqAhumk_VJG8DIS4GA1sb8ElPPHZZGYEHmNvnHU1VVaPDCw1tI8n3uXg__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_5rAUs3HknUI7DU8Jyc5RlFcosqCXTOV-qwOaOE1Mul_ppK8QCta-NSxxCdtVg6i12km4zTR5l0SjgzfHGUNxog__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_97T9qQZ3dEI1oDS6NvYTPcFk_jUXFJ0NRwyd5FZ2S585JGMtlqbF28Hc85yeifgKEnNoInoW93Za9c5QJCspeQ__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_DVcJZnHFaQQlzl8czovv7RuDRQIToEr5_3lLe-Mn1Sm6VreJ5xoXEFqBaWNv0XRmSg00NJ77XzQKgddhfkuk7w__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_FZMbIp5VAUEiJv1wUUM-K78Dtmb4o-titbTusDJqRuarbS9OatzAykygXo4NUqEoR9sxCIoeu8VDioQmbba6mw__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_Hj6SOUxY1APmxdQEA2HdqbA52GD3WJE571nqr_Z-w8vi_buxP-GUjNxCsGYQvnKnnwlyykwxY-KJmjqKYmPyXQ__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_NnCmQ8rMqVyUBgL3ZDjfjJ9Vt1AMGeMzZPkDH30rGMYer0pFDpp4UDZlCEHRImO-48LdC_KdcbjP70IZA6zKUQ__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_YK9aPHVT-grv_ZVooRT79GBO9n82BNogkuWVzFO6itJEtbtsRTQpK2-0ZDLot1JpCfPb26aZwEZjeb9G4GHiBQ__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0__H1_RrdBT9b-ZhkWCQiRKpHlwURmyWUudeOhj5UslLXhXl8mr9w5CGqdobi9A5wCVEIRMsO4yuFyzx2gMPr-_Q__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_evvkuGf92MVrmIvhr07911LuRTiPBKDjIQ0q_7L-mPGGYkWVKMBPQ5pB5lbjoaOnvr0fpC9k003EunfwSdss2g__.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/actions_invocation_record.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_collector.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_converter.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_xcresult.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/android.ks +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.jks +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.p12 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.jks +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.p12 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificate.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificates.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_validate.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/test_beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/conftest.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/mocks/AuthKeyMock.p8 +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_from_cli_args.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_publish_action.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/firebase_releases.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/google_play_tracks.json +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_android_app_bundle.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_firebase_app_distribution.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_google_play.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_keychain.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/tools/test_universal_apk_generator.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/__init__.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/test_deprecated.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_backwards_file_reader.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_levenshtein_distance.py +0 -0
- {codemagic_cli_tools-0.47.4 → codemagic_cli_tools-0.48.0}/tests/utilities/test_versions.py +0 -0
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import abc
|
|
4
4
|
import enum
|
|
5
|
-
import re
|
|
6
5
|
import shlex
|
|
7
6
|
from typing import TYPE_CHECKING
|
|
8
7
|
from typing import Any
|
|
@@ -18,6 +17,7 @@ from codemagic.apple.resources import LinkedResourceData
|
|
|
18
17
|
from codemagic.apple.resources import Resource
|
|
19
18
|
from codemagic.apple.resources import ResourceId
|
|
20
19
|
from codemagic.apple.resources import ResourceType
|
|
20
|
+
from codemagic.utilities import case_conversion
|
|
21
21
|
|
|
22
22
|
if TYPE_CHECKING:
|
|
23
23
|
from codemagic.apple import AppStoreConnectApiClient
|
|
@@ -30,12 +30,7 @@ class ResourceManager(Generic[R], metaclass=abc.ABCMeta):
|
|
|
30
30
|
class Filter:
|
|
31
31
|
@classmethod
|
|
32
32
|
def _get_field_name(cls, field_name) -> str:
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
@classmethod
|
|
36
|
-
def _snake_to_camel(cls, field_name: str) -> str:
|
|
37
|
-
patt = re.compile(r"_(\w)")
|
|
38
|
-
return patt.sub(lambda m: m.group(1).upper(), field_name)
|
|
33
|
+
return case_conversion.snake_to_camel(field_name)
|
|
39
34
|
|
|
40
35
|
@classmethod
|
|
41
36
|
def _get_param_value(cls, field_value) -> str:
|
|
@@ -12,6 +12,7 @@ from codemagic.apple.resources import Platform
|
|
|
12
12
|
from codemagic.apple.resources import ResourceId
|
|
13
13
|
from codemagic.apple.resources import ResourceType
|
|
14
14
|
from codemagic.apple.resources import ReviewSubmission
|
|
15
|
+
from codemagic.apple.resources import ReviewSubmissionItem
|
|
15
16
|
from codemagic.apple.resources import ReviewSubmissionState
|
|
16
17
|
|
|
17
18
|
|
|
@@ -99,3 +100,11 @@ class ReviewSubmissions(ResourceManager[ReviewSubmission]):
|
|
|
99
100
|
json=payload,
|
|
100
101
|
).json()
|
|
101
102
|
return ReviewSubmission(response["data"])
|
|
103
|
+
|
|
104
|
+
def list_items(self, review_submission: Union[LinkedResourceData, ResourceId]) -> List[ReviewSubmissionItem]:
|
|
105
|
+
"""
|
|
106
|
+
https://developer.apple.com/documentation/appstoreconnectapi/list_the_items_in_a_review_submission
|
|
107
|
+
"""
|
|
108
|
+
review_submission_id = self._get_resource_id(review_submission)
|
|
109
|
+
url = f"{self.client.API_URL}/reviewSubmissions/{review_submission_id}/items"
|
|
110
|
+
return [ReviewSubmissionItem(item) for item in self.client.paginate(url)]
|
|
@@ -3,6 +3,7 @@ from __future__ import annotations
|
|
|
3
3
|
import textwrap
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from typing import Dict
|
|
6
|
+
from typing import Iterable
|
|
6
7
|
from typing import List
|
|
7
8
|
from typing import Optional
|
|
8
9
|
|
|
@@ -43,6 +44,19 @@ class Error(DictSerializable):
|
|
|
43
44
|
meta: Optional[ErrorMeta] = None
|
|
44
45
|
links: Optional[Dict[str, str]] = None
|
|
45
46
|
|
|
47
|
+
@property
|
|
48
|
+
def associated_errors(self) -> Dict[str, List[Error]]:
|
|
49
|
+
if not self.meta or not self.meta.associatedErrors:
|
|
50
|
+
return {}
|
|
51
|
+
return self.meta.associatedErrors
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def source_pointer(self) -> Optional[str]:
|
|
55
|
+
try:
|
|
56
|
+
return self.source["pointer"] if self.source else None
|
|
57
|
+
except KeyError:
|
|
58
|
+
return None
|
|
59
|
+
|
|
46
60
|
def __post_init__(self):
|
|
47
61
|
if isinstance(self.meta, dict):
|
|
48
62
|
self.meta = ErrorMeta(**self.meta)
|
|
@@ -78,5 +92,10 @@ class ErrorResponse(DictSerializable):
|
|
|
78
92
|
)
|
|
79
93
|
return error_response
|
|
80
94
|
|
|
95
|
+
def iter_associated_errors(self) -> Iterable[Error]:
|
|
96
|
+
for error in self.errors:
|
|
97
|
+
for errors in error.associated_errors.values():
|
|
98
|
+
yield from errors
|
|
99
|
+
|
|
81
100
|
def __str__(self):
|
|
82
101
|
return "\n".join(map(str, self.errors))
|
|
@@ -5,7 +5,6 @@ import pathlib
|
|
|
5
5
|
import re
|
|
6
6
|
import subprocess
|
|
7
7
|
from dataclasses import dataclass
|
|
8
|
-
from functools import lru_cache
|
|
9
8
|
from typing import Dict
|
|
10
9
|
from typing import List
|
|
11
10
|
from typing import Optional
|
|
@@ -13,6 +12,7 @@ from typing import Sequence
|
|
|
13
12
|
from typing import Union
|
|
14
13
|
|
|
15
14
|
from codemagic.mixins import RunningCliAppMixin
|
|
15
|
+
from codemagic.utilities import case_conversion
|
|
16
16
|
|
|
17
17
|
from .runtime import Runtime
|
|
18
18
|
|
|
@@ -46,15 +46,11 @@ class Simulator(RunningCliAppMixin):
|
|
|
46
46
|
|
|
47
47
|
@classmethod
|
|
48
48
|
def create(cls, **kwargs) -> Simulator:
|
|
49
|
-
@lru_cache()
|
|
50
|
-
def camel_to_snake(s: str) -> str:
|
|
51
|
-
return re.sub(r"([A-Z])", lambda m: f"_{m.group(1).lower()}", s)
|
|
52
|
-
|
|
53
49
|
return Simulator(
|
|
54
50
|
**{
|
|
55
|
-
camel_to_snake(name): value
|
|
51
|
+
case_conversion.camel_to_snake(name): value
|
|
56
52
|
for name, value in kwargs.items()
|
|
57
|
-
if camel_to_snake(name) in cls.__dataclass_fields__ # type: ignore
|
|
53
|
+
if case_conversion.camel_to_snake(name) in cls.__dataclass_fields__ # type: ignore
|
|
58
54
|
},
|
|
59
55
|
)
|
|
60
56
|
|
|
@@ -264,6 +264,7 @@ class AbstractBaseAction(ResourceManagerMixin, PathFinderMixin, metaclass=ABCMet
|
|
|
264
264
|
def list_app_store_version_localizations(
|
|
265
265
|
self,
|
|
266
266
|
app_store_version_id: ResourceId,
|
|
267
|
+
locales: Optional[Sequence[Locale]] = None,
|
|
267
268
|
should_print: bool = True,
|
|
268
269
|
) -> List[AppStoreVersionLocalization]:
|
|
269
270
|
from .action_groups import AppStoreVersionsActionGroup
|
|
@@ -4,6 +4,7 @@ from abc import ABCMeta
|
|
|
4
4
|
from datetime import datetime
|
|
5
5
|
from typing import List
|
|
6
6
|
from typing import Optional
|
|
7
|
+
from typing import Sequence
|
|
7
8
|
from typing import Union
|
|
8
9
|
|
|
9
10
|
from codemagic import cli
|
|
@@ -12,6 +13,7 @@ from codemagic.apple.resources import App
|
|
|
12
13
|
from codemagic.apple.resources import AppStoreVersion
|
|
13
14
|
from codemagic.apple.resources import AppStoreVersionLocalization
|
|
14
15
|
from codemagic.apple.resources import Build
|
|
16
|
+
from codemagic.apple.resources import Locale
|
|
15
17
|
from codemagic.apple.resources import Platform
|
|
16
18
|
from codemagic.apple.resources import ReleaseType
|
|
17
19
|
from codemagic.apple.resources import ResourceId
|
|
@@ -19,6 +21,7 @@ from codemagic.apple.resources import ResourceId
|
|
|
19
21
|
from ..abstract_base_action import AbstractBaseAction
|
|
20
22
|
from ..action_group import AppStoreConnectActionGroup
|
|
21
23
|
from ..arguments import AppStoreVersionArgument
|
|
24
|
+
from ..arguments import AppStoreVersionLocalizationArgument
|
|
22
25
|
from ..arguments import BuildArgument
|
|
23
26
|
from ..arguments import CommonArgument
|
|
24
27
|
from ..arguments import Types
|
|
@@ -72,6 +75,28 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
|
|
|
72
75
|
**{k: v for k, v in create_params.items() if v is not None},
|
|
73
76
|
)
|
|
74
77
|
|
|
78
|
+
@cli.action(
|
|
79
|
+
"get",
|
|
80
|
+
AppStoreVersionArgument.APP_STORE_VERSION_ID,
|
|
81
|
+
action_group=AppStoreConnectActionGroup.APP_STORE_VERSIONS,
|
|
82
|
+
)
|
|
83
|
+
def get_app_store_version(
|
|
84
|
+
self,
|
|
85
|
+
app_store_version_id: Union[ResourceId, AppStoreVersion],
|
|
86
|
+
should_print: bool = True,
|
|
87
|
+
) -> AppStoreVersion:
|
|
88
|
+
"""
|
|
89
|
+
Read App Store Version information
|
|
90
|
+
"""
|
|
91
|
+
if isinstance(app_store_version_id, AppStoreVersion):
|
|
92
|
+
app_store_version_id = app_store_version_id.id
|
|
93
|
+
|
|
94
|
+
return self._get_resource(
|
|
95
|
+
app_store_version_id,
|
|
96
|
+
self.api_client.app_store_versions,
|
|
97
|
+
should_print,
|
|
98
|
+
)
|
|
99
|
+
|
|
75
100
|
@cli.action(
|
|
76
101
|
"modify",
|
|
77
102
|
AppStoreVersionArgument.APP_STORE_VERSION_ID,
|
|
@@ -148,17 +173,25 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
|
|
|
148
173
|
@cli.action(
|
|
149
174
|
"localizations",
|
|
150
175
|
AppStoreVersionArgument.APP_STORE_VERSION_ID,
|
|
176
|
+
AppStoreVersionLocalizationArgument.LOCALES,
|
|
151
177
|
action_group=AppStoreConnectActionGroup.APP_STORE_VERSIONS,
|
|
152
178
|
)
|
|
153
179
|
def list_app_store_version_localizations(
|
|
154
180
|
self,
|
|
155
181
|
app_store_version_id: ResourceId,
|
|
182
|
+
locales: Optional[Sequence[Locale]] = None,
|
|
156
183
|
should_print: bool = True,
|
|
157
184
|
) -> List[AppStoreVersionLocalization]:
|
|
158
185
|
"""
|
|
159
186
|
List All App Store Version Localizations for an App Store Version.
|
|
160
187
|
Get a list of localized, version-level information about an app, for all locales.
|
|
161
188
|
"""
|
|
189
|
+
|
|
190
|
+
def predicate(app_store_version_localization: AppStoreVersionLocalization) -> bool:
|
|
191
|
+
if not locales:
|
|
192
|
+
return True
|
|
193
|
+
return app_store_version_localization.attributes.locale in locales
|
|
194
|
+
|
|
162
195
|
return self._list_related_resources(
|
|
163
196
|
app_store_version_id,
|
|
164
197
|
AppStoreVersion,
|
|
@@ -166,4 +199,5 @@ class AppStoreVersionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
|
|
|
166
199
|
self.api_client.app_store_versions.list_app_store_version_localizations,
|
|
167
200
|
None,
|
|
168
201
|
should_print,
|
|
202
|
+
filter_predicate=predicate,
|
|
169
203
|
)
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import ABCMeta
|
|
4
|
+
from typing import List
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from typing import Union
|
|
7
|
+
|
|
8
|
+
from codemagic import cli
|
|
9
|
+
from codemagic.apple.resources import AppStoreVersionLocalization
|
|
10
|
+
from codemagic.apple.resources import ErrorResponse
|
|
11
|
+
from codemagic.apple.resources import ResourceId
|
|
12
|
+
from codemagic.apple.resources import ReviewSubmissionItem
|
|
13
|
+
from codemagic.cli import Colors
|
|
14
|
+
from codemagic.utilities import case_conversion
|
|
15
|
+
|
|
16
|
+
from ..abstract_base_action import AbstractBaseAction
|
|
17
|
+
from ..action_group import AppStoreConnectActionGroup
|
|
18
|
+
from ..arguments import CommonArgument
|
|
19
|
+
from ..arguments import ReviewSubmissionArgument
|
|
20
|
+
from ..arguments import ReviewSubmissionItemArgument
|
|
21
|
+
from ..errors import AppStoreConnectError
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ReviewSubmissionItemsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
|
|
25
|
+
@cli.action(
|
|
26
|
+
"create",
|
|
27
|
+
ReviewSubmissionArgument.REVIEW_SUBMISSION_ID,
|
|
28
|
+
ReviewSubmissionArgument.APP_CUSTOM_PRODUCT_PAGE_VERSION_ID,
|
|
29
|
+
ReviewSubmissionArgument.APP_EVENT_ID,
|
|
30
|
+
ReviewSubmissionArgument.APP_STORE_VERSION_ID,
|
|
31
|
+
ReviewSubmissionArgument.APP_STORE_VERSION_EXPERIMENT_ID,
|
|
32
|
+
action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSION_ITEMS,
|
|
33
|
+
)
|
|
34
|
+
def create_review_submission_item(
|
|
35
|
+
self,
|
|
36
|
+
review_submission_id: ResourceId,
|
|
37
|
+
app_custom_product_page_version_id: Optional[ResourceId] = None,
|
|
38
|
+
app_event_id: Optional[ResourceId] = None,
|
|
39
|
+
app_store_version_id: Optional[ResourceId] = None,
|
|
40
|
+
app_store_version_experiment_id: Optional[ResourceId] = None,
|
|
41
|
+
should_print: bool = True,
|
|
42
|
+
) -> ReviewSubmissionItem:
|
|
43
|
+
"""
|
|
44
|
+
Add contents to review submission for App Store review request
|
|
45
|
+
"""
|
|
46
|
+
optional_kwargs = {
|
|
47
|
+
"app_custom_product_page_version": app_custom_product_page_version_id,
|
|
48
|
+
"app_event": app_event_id,
|
|
49
|
+
"app_store_version": app_store_version_id,
|
|
50
|
+
"app_store_version_experiment": app_store_version_experiment_id,
|
|
51
|
+
}
|
|
52
|
+
try:
|
|
53
|
+
return self._create_resource(
|
|
54
|
+
self.api_client.review_submissions_items,
|
|
55
|
+
should_print,
|
|
56
|
+
review_submission=review_submission_id,
|
|
57
|
+
**{k: v for k, v in optional_kwargs.items() if v is not None},
|
|
58
|
+
)
|
|
59
|
+
except AppStoreConnectError as asc_error:
|
|
60
|
+
if asc_error.api_error:
|
|
61
|
+
self._on_create_review_submission_item_error(asc_error.api_error)
|
|
62
|
+
raise
|
|
63
|
+
|
|
64
|
+
@cli.action(
|
|
65
|
+
"delete",
|
|
66
|
+
ReviewSubmissionItemArgument.REVIEW_SUBMISSION_ITEM_ID,
|
|
67
|
+
CommonArgument.IGNORE_NOT_FOUND,
|
|
68
|
+
action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSION_ITEMS,
|
|
69
|
+
)
|
|
70
|
+
def delete_review_submission_item(
|
|
71
|
+
self,
|
|
72
|
+
review_submission_item_id: Union[ResourceId, ReviewSubmissionItem],
|
|
73
|
+
ignore_not_found: bool = False,
|
|
74
|
+
) -> None:
|
|
75
|
+
"""
|
|
76
|
+
Delete specified Review Submission item
|
|
77
|
+
"""
|
|
78
|
+
if isinstance(review_submission_item_id, ReviewSubmissionItem):
|
|
79
|
+
review_submission_item_id = review_submission_item_id.id
|
|
80
|
+
|
|
81
|
+
self._delete_resource(
|
|
82
|
+
self.api_client.review_submissions_items,
|
|
83
|
+
review_submission_item_id,
|
|
84
|
+
ignore_not_found,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
def _on_create_review_submission_item_error(self, error_responses: ErrorResponse):
|
|
88
|
+
"""
|
|
89
|
+
Show informative warning message if some required fields are missing
|
|
90
|
+
for App Store Version localization whose locale matches with application's
|
|
91
|
+
default locale.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
missing_attributes = self._get_missing_required_attributes_names(error_responses)
|
|
95
|
+
if not missing_attributes:
|
|
96
|
+
return
|
|
97
|
+
elif len(missing_attributes) == 1:
|
|
98
|
+
attribute_names = missing_attributes[0]
|
|
99
|
+
else:
|
|
100
|
+
attribute_names = " and ".join([", ".join(missing_attributes[:-1]), missing_attributes[-1]])
|
|
101
|
+
|
|
102
|
+
missing_default_locale_attributes_error = (
|
|
103
|
+
f"\nCreating {ReviewSubmissionItem} failed. Please ensure that {AppStoreVersionLocalization} "
|
|
104
|
+
f"for your application default locale defines {attribute_names}!\n"
|
|
105
|
+
)
|
|
106
|
+
self.echo(Colors.YELLOW(missing_default_locale_attributes_error))
|
|
107
|
+
|
|
108
|
+
@classmethod
|
|
109
|
+
def _get_missing_required_attributes_names(cls, error_responses: ErrorResponse) -> List[str]:
|
|
110
|
+
"""
|
|
111
|
+
Extract names of fields that are undefined for application's
|
|
112
|
+
default locale App Store Version localization
|
|
113
|
+
"""
|
|
114
|
+
default_locale_missing_values = set()
|
|
115
|
+
|
|
116
|
+
for associated_error in error_responses.iter_associated_errors():
|
|
117
|
+
if associated_error.code == "ENTITY_ERROR.ATTRIBUTE.REQUIRED" and associated_error.source_pointer:
|
|
118
|
+
# source pointer is like '/data/attributes/keywords'
|
|
119
|
+
asc_field_name = associated_error.source_pointer.split("/")[-1]
|
|
120
|
+
field_name = case_conversion.camel_to_snake(asc_field_name).replace("_", " ").lower()
|
|
121
|
+
default_locale_missing_values.add(field_name.replace(" url", " URL"))
|
|
122
|
+
|
|
123
|
+
return list(default_locale_missing_values)
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from abc import ABCMeta
|
|
4
|
+
from typing import List
|
|
4
5
|
|
|
5
6
|
from codemagic import cli
|
|
6
7
|
from codemagic.apple.resources import Platform
|
|
7
8
|
from codemagic.apple.resources import ResourceId
|
|
8
9
|
from codemagic.apple.resources import ReviewSubmission
|
|
10
|
+
from codemagic.apple.resources import ReviewSubmissionItem
|
|
9
11
|
|
|
10
12
|
from ..abstract_base_action import AbstractBaseAction
|
|
11
13
|
from ..action_group import AppStoreConnectActionGroup
|
|
@@ -95,3 +97,21 @@ class ReviewSubmissionsActionGroup(AbstractBaseAction, metaclass=ABCMeta):
|
|
|
95
97
|
should_print,
|
|
96
98
|
submitted=True,
|
|
97
99
|
)
|
|
100
|
+
|
|
101
|
+
@cli.action(
|
|
102
|
+
"items",
|
|
103
|
+
ReviewSubmissionArgument.REVIEW_SUBMISSION_ID,
|
|
104
|
+
action_group=AppStoreConnectActionGroup.REVIEW_SUBMISSIONS,
|
|
105
|
+
)
|
|
106
|
+
def list_review_submission_items(self, review_submission_id: ResourceId) -> List[ReviewSubmissionItem]:
|
|
107
|
+
"""
|
|
108
|
+
List review submission items for specified review submission
|
|
109
|
+
"""
|
|
110
|
+
return self._list_related_resources(
|
|
111
|
+
resource_id=review_submission_id,
|
|
112
|
+
resource_type=ReviewSubmission,
|
|
113
|
+
related_resource_type=ReviewSubmissionItem,
|
|
114
|
+
list_related_resources_method=self.api_client.review_submissions.list_items,
|
|
115
|
+
resource_filter=None,
|
|
116
|
+
should_print=True,
|
|
117
|
+
)
|
|
@@ -672,6 +672,14 @@ class ReviewSubmissionArgument(cli.Argument):
|
|
|
672
672
|
)
|
|
673
673
|
|
|
674
674
|
|
|
675
|
+
class ReviewSubmissionItemArgument(cli.Argument):
|
|
676
|
+
REVIEW_SUBMISSION_ITEM_ID = cli.ArgumentProperties(
|
|
677
|
+
key="review_submission_item_id",
|
|
678
|
+
type=ResourceId,
|
|
679
|
+
description="UUID value of the review submission",
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
|
|
675
683
|
class AppStoreVersionLocalizationArgument(cli.Argument):
|
|
676
684
|
APP_STORE_VERSION_LOCALIZATION_ID = cli.ArgumentProperties(
|
|
677
685
|
key="app_store_version_localization_id",
|
|
@@ -702,6 +710,16 @@ class AppStoreVersionLocalizationArgument(cli.Argument):
|
|
|
702
710
|
"choices": list(Locale),
|
|
703
711
|
},
|
|
704
712
|
)
|
|
713
|
+
LOCALES = cli.ArgumentProperties.duplicate(
|
|
714
|
+
LOCALE,
|
|
715
|
+
key="locales",
|
|
716
|
+
flags=("--locale", "-l"),
|
|
717
|
+
argparse_kwargs={
|
|
718
|
+
"nargs": "+",
|
|
719
|
+
"required": False,
|
|
720
|
+
"choices": list(Locale),
|
|
721
|
+
},
|
|
722
|
+
)
|
|
705
723
|
DESCRIPTION = cli.ArgumentProperties(
|
|
706
724
|
key="description",
|
|
707
725
|
flags=("--description", "-d"),
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from codemagic import cli
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from codemagic.apple.resources import ErrorResponse
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class AppStoreConnectError(cli.CliAppException):
|
|
13
|
+
def __init__(self, *args, api_error_response: Optional[ErrorResponse] = None, **kwargs):
|
|
14
|
+
self.api_error = api_error_response
|
|
15
|
+
super().__init__(*args, **kwargs)
|
|
@@ -37,7 +37,10 @@ class ResourceManagerMixin:
|
|
|
37
37
|
try:
|
|
38
38
|
resource = create_resource(**create_params)
|
|
39
39
|
except AppStoreConnectApiError as api_error:
|
|
40
|
-
raise AppStoreConnectError(
|
|
40
|
+
raise AppStoreConnectError(
|
|
41
|
+
str(api_error),
|
|
42
|
+
api_error_response=api_error.error_response,
|
|
43
|
+
) from api_error
|
|
41
44
|
|
|
42
45
|
self.printer.print_resource(resource, should_print)
|
|
43
46
|
self.printer.log_created(resource)
|
|
@@ -58,7 +61,10 @@ class ResourceManagerMixin:
|
|
|
58
61
|
try:
|
|
59
62
|
resource = read_resource(resource_id)
|
|
60
63
|
except AppStoreConnectApiError as api_error:
|
|
61
|
-
raise AppStoreConnectError(
|
|
64
|
+
raise AppStoreConnectError(
|
|
65
|
+
str(api_error),
|
|
66
|
+
api_error_response=api_error.error_response,
|
|
67
|
+
) from api_error
|
|
62
68
|
self.printer.print_resource(resource, should_print)
|
|
63
69
|
return resource
|
|
64
70
|
|
|
@@ -77,7 +83,10 @@ class ResourceManagerMixin:
|
|
|
77
83
|
try:
|
|
78
84
|
resources = list_resources(resource_filter=resource_filter)
|
|
79
85
|
except AppStoreConnectApiError as api_error:
|
|
80
|
-
raise AppStoreConnectError(
|
|
86
|
+
raise AppStoreConnectError(
|
|
87
|
+
str(api_error),
|
|
88
|
+
api_error_response=api_error.error_response,
|
|
89
|
+
) from api_error
|
|
81
90
|
|
|
82
91
|
if filter_predicate is not None:
|
|
83
92
|
resources = list(filter(filter_predicate, resources))
|
|
@@ -99,7 +108,10 @@ class ResourceManagerMixin:
|
|
|
99
108
|
try:
|
|
100
109
|
resource = read_related_resource_method(resource_id)
|
|
101
110
|
except AppStoreConnectApiError as api_error:
|
|
102
|
-
raise AppStoreConnectError(
|
|
111
|
+
raise AppStoreConnectError(
|
|
112
|
+
str(api_error),
|
|
113
|
+
api_error_response=api_error.error_response,
|
|
114
|
+
) from api_error
|
|
103
115
|
|
|
104
116
|
if resource is None:
|
|
105
117
|
raise AppStoreConnectError(f"{related_resource_type} was not found for {resource_type} {resource_id}")
|
|
@@ -115,6 +127,7 @@ class ResourceManagerMixin:
|
|
|
115
127
|
list_related_resources_method: Callable[..., List[R2]],
|
|
116
128
|
resource_filter: Optional[ResourceManager.Filter],
|
|
117
129
|
should_print: bool,
|
|
130
|
+
filter_predicate: Optional[Callable[[R2], bool]] = None,
|
|
118
131
|
) -> List[R2]:
|
|
119
132
|
self.printer.log_get_related(related_resource_type, resource_type, resource_id)
|
|
120
133
|
kwargs = {"resource_filter": resource_filter} if resource_filter else {}
|
|
@@ -122,7 +135,13 @@ class ResourceManagerMixin:
|
|
|
122
135
|
try:
|
|
123
136
|
resources = list_related_resources_method(resource_id, **kwargs)
|
|
124
137
|
except AppStoreConnectApiError as api_error:
|
|
125
|
-
raise AppStoreConnectError(
|
|
138
|
+
raise AppStoreConnectError(
|
|
139
|
+
str(api_error),
|
|
140
|
+
api_error_response=api_error.error_response,
|
|
141
|
+
) from api_error
|
|
142
|
+
|
|
143
|
+
if filter_predicate is not None:
|
|
144
|
+
resources = list(filter(filter_predicate, resources))
|
|
126
145
|
|
|
127
146
|
self.printer.log_found(related_resource_type, resources, resource_filter, resource_type, resource_id)
|
|
128
147
|
self.printer.print_resources(resources, should_print)
|
|
@@ -146,7 +165,10 @@ class ResourceManagerMixin:
|
|
|
146
165
|
if ignore_not_found is True and api_error.status_code == 404:
|
|
147
166
|
self.printer.log_ignore_not_deleted(resource_manager.resource_type, resource_id)
|
|
148
167
|
else:
|
|
149
|
-
raise AppStoreConnectError(
|
|
168
|
+
raise AppStoreConnectError(
|
|
169
|
+
str(api_error),
|
|
170
|
+
api_error_response=api_error.error_response,
|
|
171
|
+
) from api_error
|
|
150
172
|
else:
|
|
151
173
|
self.printer.log_deleted(resource_manager.resource_type, resource_id)
|
|
152
174
|
|
|
@@ -166,7 +188,10 @@ class ResourceManagerMixin:
|
|
|
166
188
|
try:
|
|
167
189
|
resource = modify_resource(resource_id, **update_params)
|
|
168
190
|
except AppStoreConnectApiError as api_error:
|
|
169
|
-
raise AppStoreConnectError(
|
|
191
|
+
raise AppStoreConnectError(
|
|
192
|
+
str(api_error),
|
|
193
|
+
api_error_response=api_error.error_response,
|
|
194
|
+
) from api_error
|
|
170
195
|
|
|
171
196
|
self.printer.log_modified(resource_manager.resource_type, resource_id)
|
|
172
197
|
self.printer.print_resource(resource, should_print)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def snake_to_camel(snake_case: str) -> str:
|
|
5
|
+
return re.sub(r"_(\w)", lambda m: m.group(1).upper(), snake_case)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def camel_to_snake(camel_case: str) -> str:
|
|
9
|
+
return re.sub(r"([A-Z])", lambda m: f"_{m.group(1).lower()}", camel_case).lstrip("_")
|
|
@@ -43,20 +43,3 @@ class StubFilter(ResourceManager.Filter):
|
|
|
43
43
|
def test_resource_manager_filter_to_params_conversion(filter_params, expected_query_params):
|
|
44
44
|
test_filter = StubFilter(**filter_params)
|
|
45
45
|
assert test_filter.as_query_params() == expected_query_params
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
@pytest.mark.parametrize(
|
|
49
|
-
"snake_case_input, expected_camel_case_output",
|
|
50
|
-
[
|
|
51
|
-
("", ""),
|
|
52
|
-
("word", "word"),
|
|
53
|
-
("_word", "Word"),
|
|
54
|
-
("snake_case", "snakeCase"),
|
|
55
|
-
("snake_case_", "snakeCase_"),
|
|
56
|
-
("snake_case_ snakeCase", "snakeCase_ snakeCase"),
|
|
57
|
-
("a_b_c_d_e_f", "aBCDEF"),
|
|
58
|
-
],
|
|
59
|
-
)
|
|
60
|
-
def test_resource_manager_filter_camel_case_converter(snake_case_input, expected_camel_case_output):
|
|
61
|
-
converted_input = ResourceManager.Filter._snake_to_camel(snake_case_input)
|
|
62
|
-
assert converted_input == expected_camel_case_output
|
|
@@ -47,6 +47,12 @@ def api_error_response() -> Dict:
|
|
|
47
47
|
return json.loads(mock_path.read_text())
|
|
48
48
|
|
|
49
49
|
|
|
50
|
+
@pytest.fixture
|
|
51
|
+
def api_error_response_entity_state_invalid() -> Dict:
|
|
52
|
+
mock_path = pathlib.Path(__file__).parent / "mocks" / "error_response_entity_state_invalid.json"
|
|
53
|
+
return json.loads(mock_path.read_text())
|
|
54
|
+
|
|
55
|
+
|
|
50
56
|
@pytest.fixture
|
|
51
57
|
def api_error_response_with_links() -> Dict:
|
|
52
58
|
mock_path = pathlib.Path(__file__).parent / "mocks" / "error_response_with_links.json"
|
codemagic_cli_tools-0.48.0/tests/apple/resources/mocks/error_response_entity_state_invalid.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"errors": [
|
|
3
|
+
{
|
|
4
|
+
"id": "6d516aab-7949-48e1-9205-89b9bc2e736b",
|
|
5
|
+
"status": "409",
|
|
6
|
+
"code": "STATE_ERROR.ENTITY_STATE_INVALID",
|
|
7
|
+
"title": "appStoreVersions with id '409ebefb-ebd1-4f1a-903d-6ba16e013ebf' is not in valid state.",
|
|
8
|
+
"detail": "This resource cannot be reviewed, please check associated errors to see why.",
|
|
9
|
+
"meta": {
|
|
10
|
+
"associatedErrors": {
|
|
11
|
+
"/v1/appStoreVersionLocalizations/253cf0c8-8057-49b7-be16-3b1cc78837e5": [
|
|
12
|
+
{
|
|
13
|
+
"id": "00190291-bf3a-417d-903c-804640a7df60",
|
|
14
|
+
"status": "409",
|
|
15
|
+
"code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
|
|
16
|
+
"title": "The provided entity is missing a required attribute",
|
|
17
|
+
"detail": "You must provide a value for the attribute 'description' with this request",
|
|
18
|
+
"source": {
|
|
19
|
+
"pointer": "/data/attributes/description"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "d5e83b1c-85b5-44ea-a9ba-5f2f3aa0cba0",
|
|
24
|
+
"status": "409",
|
|
25
|
+
"code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
|
|
26
|
+
"title": "The provided entity is missing a required attribute",
|
|
27
|
+
"detail": "You must provide a value for the attribute 'keywords' with this request",
|
|
28
|
+
"source": {
|
|
29
|
+
"pointer": "/data/attributes/keywords"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "5d9f0f60-8791-4bed-bb98-435250599281",
|
|
34
|
+
"status": "409",
|
|
35
|
+
"code": "ENTITY_ERROR.ATTRIBUTE.REQUIRED",
|
|
36
|
+
"title": "The provided entity is missing a required attribute",
|
|
37
|
+
"detail": "You must provide a value for the attribute 'supportUrl' with this request",
|
|
38
|
+
"source": {
|
|
39
|
+
"pointer": "/data/attributes/supportUrl"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from codemagic.apple.resources import ErrorResponse
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_error_response_initialization(api_error_response):
|
|
7
|
+
error_response = ErrorResponse(api_error_response)
|
|
8
|
+
assert error_response.dict() == api_error_response
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_error_response_with_links(api_error_response_with_links):
|
|
12
|
+
error_response = ErrorResponse(api_error_response_with_links)
|
|
13
|
+
assert error_response.dict() == api_error_response_with_links
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_error_iter_associated_errors(api_error_response_entity_state_invalid):
|
|
17
|
+
error_response = ErrorResponse(api_error_response_entity_state_invalid)
|
|
18
|
+
associated_errors = list(error_response.iter_associated_errors())
|
|
19
|
+
assert len(associated_errors) == 3
|
|
20
|
+
assert associated_errors[0].source_pointer == "/data/attributes/description"
|
|
21
|
+
assert associated_errors[1].source_pointer == "/data/attributes/keywords"
|
|
22
|
+
assert associated_errors[2].source_pointer == "/data/attributes/supportUrl"
|