codemagic-cli-tools 0.47.3__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.3 → codemagic_cli_tools-0.48.0}/PKG-INFO +1 -1
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/pyproject.toml +2 -1
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py +1 -1
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__version__.py-e +1 -1
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/resource_manager.py +2 -7
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submissions.py +9 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/enums.py +10 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/error_response.py +19 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_app.py +33 -2
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_client.py +7 -6
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_error.py +13 -9
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/simulator.py +3 -7
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/abstract_base_action.py +1 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/arguments.py +29 -11
- codemagic_cli_tools-0.48.0/src/codemagic/tools/_app_store_connect/errors.py +15 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_manager_mixin.py +32 -7
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/app_store_connect.py +8 -4
- codemagic_cli_tools-0.48.0/src/codemagic/utilities/case_conversion.py +9 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_resource_manager.py +0 -17
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/conftest.py +6 -0
- codemagic_cli_tools-0.48.0/tests/apple/resources/enums/test_certificate_type.py +12 -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.3/src/codemagic/tools/_app_store_connect/action_groups/review_submission_items_actions_group.py +0 -49
- codemagic_cli_tools-0.47.3/src/codemagic/tools/_app_store_connect/errors.py +0 -5
- codemagic_cli_tools-0.47.3/tests/apple/resources/test_error_response.py +0 -13
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/LICENSE +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/README.md +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_error.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/api_session.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/apps/apps.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/builds/builds.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/json_web_token_manager.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_id_capabilities.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/bundle_ids.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/devices.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/profiles.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/provisioning/signing_certificates.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/testflight/beta_groups.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/type_declarations.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/app_store_versions.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/pre_release_versions.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/app_store_connect/versioning/review_submission_items.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_localization.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/app_store_version_submission.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_localization.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_detail.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_app_review_submission.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_build_localization.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/beta_group.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/build_beta_detail.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/bundle_id_capability.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/device.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/pre_release_version.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/profile.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/review_submission_item.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/signing_certificate.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/action_group.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/action_callable.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_formatter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_parser_builder.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/argument_properties.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/common_argument_types.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/argument/typed_cli_argument.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_help_formatter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_process_stream.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/cli_types.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/colors.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/cli/environment.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/data/jars/bundletool-all-1.13.1.jar +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/errors.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/google_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/acting_manager_mixin.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/mixins/listing_manager_mixin.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/release_manager.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resource_managers/resource_manager.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/app_identifier.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/identifiers/resource_identifier.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/release_notes.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/edit.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/enums.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/resources/track.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/path_finder.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/running_cli_app.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/mixins/str_converter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/altool_result.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/altool/enums.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/android_signing_info.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/abstract_package.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/ipa.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/application_package/macos_package.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/bundle_id_detector.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_attributes.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/certificate_p12_exporter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_sign_entitlements.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/code_signing_settings_manager.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/enums.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/export_options.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/json_serializable.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/definitions.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/junit/printer.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/keystore.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/pbx_project.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/private_key.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/provisioning_profile.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/core_simulator_service.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/simulator/runtime.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/line.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/table/table.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcode.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcodebuild.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xcpretty.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/collector.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/converter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresult.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/models/xctests/xcresulttool.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/py.typed +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/scripts/code_signing_manager.rb +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/abstract_shell_tool.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/shell_tools/keytool.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_group.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/actions/publish_action.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_app_store_connect/resource_printer.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/_xcode_project/arguments.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_app_bundle.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/__main__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/android_keystore.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/android_keystore/arguments.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/codemagic_cli_tools.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/__main__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/arguments.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/errors.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/firebase_app_distribution_action.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/firebase_app_distribution/resource_printer.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/git_changelog.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/__main__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/action_groups/tracks_action_group.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/actions/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/argument_types.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/arguments.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/errors.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/google_play/google_play_base_action.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/keychain.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/universal_apk_generator.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/tools/xcode_project.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/base_auditor.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/exception_auditor.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/auditing/http_request_auditor.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/backwards_file_reader.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/decorators.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/levenshtein_distance.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/log.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/utilities/versions.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/apps/test_apps.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/builds/test_builds.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_id_capabilities.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_bundle_ids.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_devices.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_profiles.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/provisioning/test_signing_certificates.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/resource_manager_test_base.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_api_session.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/test_json_web_token_manager.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/testflight/test_beta_groups.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_app_store_versions.py +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_pre_release_versions.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submission_items.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/app_store_connect/versioning/test_review_submissions.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/enums/test_profile_type.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/app_store_version.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/build.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/bundle_id_capability.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/certificate.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/device.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/error_response_with_links.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/mock_resource.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/pre_release_version.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/mocks/profile.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_app_store_version_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_build_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_capability_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_bundle_id_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_device_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_pre_release_version_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_profile_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_signing_certificate_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/apple/resources/test_undefined_resource_fields.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_bounded_number.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_iso_8601_datetime.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/common_argument_types/test_maybe_dir.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/argument/test_argument.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/mocks/utf-8-sample.txt +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/test_cli_process.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/cli/test_decorators.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/test_firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google/test_live_firebase_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/edit.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/mocks/track.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_edit_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_resource_print.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/resources/test_track_resource.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/google_play/test_api_client.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mixins/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mixins/test_string_converter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/certificate.asn1 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/encrypted.pem.pub +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/mocks/unencrypted.pem.pub +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_auth.txt +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_failure_other.txt +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_upload_success.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/mocks/mock_validation_failure.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_result.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/altool/test_altool_retrying.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/enums/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/enums/test_resource_enum.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/mocks/testsuite.xml +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/junit/test_xml_generation.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate-no-password.p12 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/certificate.p12 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/codemagic_io_wildcard_development.mobileprovision +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/export_options.plist +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock.ipa +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_0_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_1_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_2_icloud_container_environments.plist +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_openssh_private_key +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_rsa_private_key +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/mocks/mock_xcode/Contents/version.plist +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/devices.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/mocks/simulator.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_runtime.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/simulator/test_simulator.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_certificate_attributes.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_code_sign_entitlements.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_export_options.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_private_key.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_provisioning_profile.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_table.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/test_xcode.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_1NtPgUPcB1A83X977l5Q91ElstUeVDnqAhumk_VJG8DIS4GA1sb8ElPPHZZGYEHmNvnHU1VVaPDCw1tI8n3uXg__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_5rAUs3HknUI7DU8Jyc5RlFcosqCXTOV-qwOaOE1Mul_ppK8QCta-NSxxCdtVg6i12km4zTR5l0SjgzfHGUNxog__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_97T9qQZ3dEI1oDS6NvYTPcFk_jUXFJ0NRwyd5FZ2S585JGMtlqbF28Hc85yeifgKEnNoInoW93Za9c5QJCspeQ__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_DVcJZnHFaQQlzl8czovv7RuDRQIToEr5_3lLe-Mn1Sm6VreJ5xoXEFqBaWNv0XRmSg00NJ77XzQKgddhfkuk7w__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_FZMbIp5VAUEiJv1wUUM-K78Dtmb4o-titbTusDJqRuarbS9OatzAykygXo4NUqEoR9sxCIoeu8VDioQmbba6mw__.json +0 -0
- {codemagic_cli_tools-0.47.3 → 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.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_NnCmQ8rMqVyUBgL3ZDjfjJ9Vt1AMGeMzZPkDH30rGMYer0pFDpp4UDZlCEHRImO-48LdC_KdcbjP70IZA6zKUQ__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_YK9aPHVT-grv_ZVooRT79GBO9n82BNogkuWVzFO6itJEtbtsRTQpK2-0ZDLot1JpCfPb26aZwEZjeb9G4GHiBQ__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0__H1_RrdBT9b-ZhkWCQiRKpHlwURmyWUudeOhj5UslLXhXl8mr9w5CGqdobi9A5wCVEIRMsO4yuFyzx2gMPr-_Q__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/0_evvkuGf92MVrmIvhr07911LuRTiPBKDjIQ0q_7L-mPGGYkWVKMBPQ5pB5lbjoaOnvr0fpC9k003EunfwSdss2g__.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/mocks/actions_invocation_record.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_collector.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_converter.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/models/xctests/test_xcresult.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/android.ks +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.jks +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/non-rfc-cert-keystore.p12 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.jks +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/mocks/rfc-cert-keystore.p12 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificate.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_get_certificates.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/shell_tools/keytool/test_validate.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/arguments/test_beta_build_localizations.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/conftest.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/mocks/AuthKeyMock.p8 +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_from_cli_args.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/app_store_connect/test_publish_action.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/firebase_releases.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/mocks/google_play_tracks.json +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_android_app_bundle.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_firebase_app_distribution.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_google_play.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_keychain.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/tools/test_universal_apk_generator.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/__init__.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/decorators/test_deprecated.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/test_backwards_file_reader.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/test_levenshtein_distance.py +0 -0
- {codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/tests/utilities/test_versions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "codemagic-cli-tools"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.48.0"
|
|
4
4
|
description = "CLI tools used in Codemagic builds"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
authors = [
|
|
@@ -55,6 +55,7 @@ pytest = "*"
|
|
|
55
55
|
pytest-cov = "*"
|
|
56
56
|
ruff = "*"
|
|
57
57
|
types-requests = "*"
|
|
58
|
+
typing-extensions = "*"
|
|
58
59
|
|
|
59
60
|
[build-system]
|
|
60
61
|
requires = ["poetry-core>=1.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)]
|
{codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/apple/resources/enums.py
RENAMED
|
@@ -134,6 +134,16 @@ class CertificateType(ResourceEnum):
|
|
|
134
134
|
return CertificateType.DISTRIBUTION
|
|
135
135
|
elif profile_type is profile_type.TVOS_APP_ADHOC:
|
|
136
136
|
return CertificateType.DISTRIBUTION
|
|
137
|
+
elif profile_type is profile_type.MAC_CATALYST_APP_DEVELOPMENT:
|
|
138
|
+
return CertificateType.DEVELOPMENT
|
|
139
|
+
elif profile_type is profile_type.MAC_CATALYST_APP_STORE:
|
|
140
|
+
return CertificateType.DISTRIBUTION
|
|
141
|
+
elif profile_type is profile_type.MAC_CATALYST_APP_DIRECT:
|
|
142
|
+
return CertificateType.DEVELOPER_ID_APPLICATION
|
|
143
|
+
elif profile_type is profile_type.IOS_APP_INHOUSE:
|
|
144
|
+
return CertificateType.DISTRIBUTION
|
|
145
|
+
elif profile_type is profile_type.TVOS_APP_INHOUSE:
|
|
146
|
+
return CertificateType.DISTRIBUTION
|
|
137
147
|
else:
|
|
138
148
|
raise ValueError(f"Certificate type for profile type {profile_type} is unknown")
|
|
139
149
|
|
|
@@ -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))
|
|
@@ -43,9 +43,23 @@ from .cli_types import ObfuscatedCommand
|
|
|
43
43
|
from .cli_types import ObfuscationPattern
|
|
44
44
|
from .colors import Colors
|
|
45
45
|
|
|
46
|
+
try:
|
|
47
|
+
from typing import assert_never # type: ignore
|
|
48
|
+
except ImportError:
|
|
49
|
+
|
|
50
|
+
def assert_never(arg) -> NoReturn: # type: ignore
|
|
51
|
+
raise AssertionError(f"Expected code to be unreachable, but got: {arg!r}")
|
|
52
|
+
|
|
53
|
+
|
|
46
54
|
if TYPE_CHECKING:
|
|
47
55
|
from argparse import _SubParsersAction as SubParsersAction
|
|
48
56
|
|
|
57
|
+
from typing_extensions import Literal
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class ArgumentValueEncodingError(Exception):
|
|
61
|
+
pass
|
|
62
|
+
|
|
49
63
|
|
|
50
64
|
class CliAppException(Exception): # noqa: N818
|
|
51
65
|
def __init__(self, message: str, cli_process: Optional[CliProcess] = None):
|
|
@@ -191,6 +205,20 @@ class CliApp(metaclass=abc.ABCMeta):
|
|
|
191
205
|
|
|
192
206
|
return parser, args
|
|
193
207
|
|
|
208
|
+
@classmethod
|
|
209
|
+
def _validate_args(cls, cli_args: argparse.Namespace) -> Literal[True]:
|
|
210
|
+
for destination_name, argument_value in vars(cli_args).items():
|
|
211
|
+
if not isinstance(argument_value, str):
|
|
212
|
+
continue
|
|
213
|
+
|
|
214
|
+
try:
|
|
215
|
+
argument_value.encode()
|
|
216
|
+
except UnicodeEncodeError:
|
|
217
|
+
error = f"Unknown encoding for argument {destination_name} value: {argument_value}"
|
|
218
|
+
raise ArgumentValueEncodingError(error)
|
|
219
|
+
|
|
220
|
+
return True
|
|
221
|
+
|
|
194
222
|
@classmethod
|
|
195
223
|
def invoke_cli(cls) -> NoReturn:
|
|
196
224
|
os.environ["_CLI_INVOCATION"] = "true"
|
|
@@ -208,10 +236,12 @@ class CliApp(metaclass=abc.ABCMeta):
|
|
|
208
236
|
raise argparse.ArgumentError(args.action, "the following argument is required: action")
|
|
209
237
|
elif cls._action_requires_subcommand(args.action) and not args.action_subcommand:
|
|
210
238
|
raise argparse.ArgumentError(args.action_subcommand, "the following argument is required: subcommand")
|
|
239
|
+
elif not cls._validate_args(args):
|
|
240
|
+
assert_never("Invalid args") # In case of invalid args validation will raise
|
|
211
241
|
else:
|
|
212
242
|
CliApp._running_app = cls._create_instance(parser, args)
|
|
213
243
|
CliApp._running_app._invoke_action(args)
|
|
214
|
-
except argparse.ArgumentError as argument_error:
|
|
244
|
+
except (ArgumentValueEncodingError, argparse.ArgumentError) as argument_error:
|
|
215
245
|
parser.error(str(argument_error))
|
|
216
246
|
status = 2
|
|
217
247
|
except cls.CLI_EXCEPTION_TYPE as cli_exception:
|
|
@@ -235,7 +265,8 @@ class CliApp(metaclass=abc.ABCMeta):
|
|
|
235
265
|
|
|
236
266
|
@classmethod
|
|
237
267
|
def _log_cli_invoke_started(cls):
|
|
238
|
-
|
|
268
|
+
safe_args = (arg.encode("utf-8", errors="replace").decode() for arg in sys.argv)
|
|
269
|
+
exec_line = f'Execute {" ".join(map(shlex.quote, safe_args))}'
|
|
239
270
|
install_line = f"From {pathlib.Path(__file__).parent.parent.resolve()}"
|
|
240
271
|
version_line = f"Using Python {platform.python_version()} on {platform.system()} {platform.release()}"
|
|
241
272
|
separator = "-" * max(len(exec_line), len(version_line), len(install_line))
|
{codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_client.py
RENAMED
|
@@ -9,6 +9,7 @@ from typing import Union
|
|
|
9
9
|
import httplib2
|
|
10
10
|
from googleapiclient import discovery
|
|
11
11
|
from googleapiclient import errors
|
|
12
|
+
from oauth2client import client
|
|
12
13
|
from oauth2client.service_account import ServiceAccountCredentials
|
|
13
14
|
|
|
14
15
|
from codemagic.utilities import log
|
|
@@ -68,7 +69,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
68
69
|
http=http,
|
|
69
70
|
cache_discovery=False,
|
|
70
71
|
)
|
|
71
|
-
except (errors.Error,
|
|
72
|
+
except (errors.Error, client.Error) as e:
|
|
72
73
|
raise AuthorizationError(e) from e
|
|
73
74
|
|
|
74
75
|
@property
|
|
@@ -85,7 +86,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
85
86
|
edit_request = self.edits_service.insert(body={}, packageName=package_name)
|
|
86
87
|
edit_response = edit_request.execute()
|
|
87
88
|
self._logger.debug(f"Created edit {edit_response} for package {package_name!r}")
|
|
88
|
-
except (errors.Error,
|
|
89
|
+
except (errors.Error, client.Error) as e:
|
|
89
90
|
raise EditError("create", package_name, e) from e
|
|
90
91
|
else:
|
|
91
92
|
return Edit(**edit_response)
|
|
@@ -100,7 +101,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
100
101
|
)
|
|
101
102
|
delete_request.execute()
|
|
102
103
|
self._logger.debug(f"Deleted edit {edit_id} for package {package_name!r}")
|
|
103
|
-
except (errors.Error,
|
|
104
|
+
except (errors.Error, client.Error) as e:
|
|
104
105
|
if isinstance(e, errors.HttpError) and "edit has already been successfully committed" in e.error_details:
|
|
105
106
|
# This can be ignored as the commit has already been exhausted
|
|
106
107
|
return
|
|
@@ -136,7 +137,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
136
137
|
)
|
|
137
138
|
track_response = track_request.execute()
|
|
138
139
|
self._logger.debug(f"Got track {track_name!r} for package {package_name!r}: {track_response}")
|
|
139
|
-
except (errors.Error,
|
|
140
|
+
except (errors.Error, client.Error) as e:
|
|
140
141
|
raise GetResourceError("track", package_name, e) from e
|
|
141
142
|
else:
|
|
142
143
|
return Track(**track_response)
|
|
@@ -161,7 +162,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
161
162
|
)
|
|
162
163
|
tracks_response = tracks_request.execute()
|
|
163
164
|
self._logger.debug(f"Got tracks for package {package_name!r}: {tracks_response}")
|
|
164
|
-
except (errors.Error,
|
|
165
|
+
except (errors.Error, client.Error) as e:
|
|
165
166
|
raise ListResourcesError("tracks", package_name, e) from e
|
|
166
167
|
else:
|
|
167
168
|
return [Track(**track) for track in tracks_response["tracks"]]
|
|
@@ -189,7 +190,7 @@ class GooglePlayDeveloperAPIClient:
|
|
|
189
190
|
try:
|
|
190
191
|
track_response = track_request.execute()
|
|
191
192
|
commit_response = commit_request.execute()
|
|
192
|
-
except (errors.Error,
|
|
193
|
+
except (errors.Error, client.Error) as e:
|
|
193
194
|
raise UpdateResourceError("track", package_name, e) from e
|
|
194
195
|
|
|
195
196
|
self._logger.debug(f"Track {track.track!r} update response for package {package_name!r}: {track_response}")
|
{codemagic_cli_tools-0.47.3 → codemagic_cli_tools-0.48.0}/src/codemagic/google_play/api_error.py
RENAMED
|
@@ -3,26 +3,30 @@ from abc import abstractmethod
|
|
|
3
3
|
from typing import Union
|
|
4
4
|
|
|
5
5
|
from googleapiclient import errors
|
|
6
|
+
from oauth2client import client
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class GooglePlayDeveloperAPIClientError(Exception):
|
|
9
10
|
@classmethod
|
|
10
|
-
def _get_error_reason(cls, error: Union[errors.Error,
|
|
11
|
-
if isinstance(error, errors.
|
|
12
|
-
return
|
|
13
|
-
|
|
14
|
-
reason = error._get_reason()
|
|
15
|
-
return reason or "Http Error"
|
|
11
|
+
def _get_error_reason(cls, error: Union[errors.Error, client.Error]) -> str:
|
|
12
|
+
if isinstance(error, errors.HttpError):
|
|
13
|
+
return error._get_reason() or "Http Error"
|
|
14
|
+
return str(error)
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
class AuthorizationError(GooglePlayDeveloperAPIClientError):
|
|
19
|
-
def __init__(self, error: Union[errors.Error,
|
|
18
|
+
def __init__(self, error: Union[errors.Error, client.Error]):
|
|
20
19
|
reason = self._get_error_reason(error)
|
|
21
20
|
super().__init__(f"Unable to authorize with provided credentials. {reason}")
|
|
22
21
|
|
|
23
22
|
|
|
24
23
|
class EditError(GooglePlayDeveloperAPIClientError):
|
|
25
|
-
def __init__(
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
action: str,
|
|
27
|
+
package_name: str,
|
|
28
|
+
error: Union[errors.Error, client.Error],
|
|
29
|
+
):
|
|
26
30
|
reason = self._get_error_reason(error)
|
|
27
31
|
super().__init__(f'Unable to {action} an edit for package "{package_name}". {reason}')
|
|
28
32
|
|
|
@@ -32,7 +36,7 @@ class _RequestError(GooglePlayDeveloperAPIClientError, ABC):
|
|
|
32
36
|
self,
|
|
33
37
|
resource_description: str,
|
|
34
38
|
package_name: str,
|
|
35
|
-
request_error: Union[errors.Error,
|
|
39
|
+
request_error: Union[errors.Error, client.Error],
|
|
36
40
|
):
|
|
37
41
|
self.package_name = package_name
|
|
38
42
|
self.request_error = request_error
|
|
@@ -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
|
+
)
|