capo-codedeploy 0.1.0__tar.gz → 0.3.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.
- {capo_codedeploy-0.1.0/src/capo_codedeploy.egg-info → capo_codedeploy-0.3.0}/PKG-INFO +3 -1
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/pyproject.toml +3 -1
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/__init__.py +1 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_auth/_signers.py +50 -17
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_auth/_sigv4.py +164 -19
- capo_codedeploy-0.3.0/src/capo_codedeploy/_body.py +221 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_protocol/eventstream.py +15 -13
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_services/_pipeline.py +51 -2
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0/src/capo_codedeploy.egg-info}/PKG-INFO +3 -1
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy.egg-info/SOURCES.txt +2 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy.egg-info/requires.txt +3 -0
- capo_codedeploy-0.3.0/tests/test_body.py +225 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/tests/test_sigv4.py +217 -16
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/LICENSE +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/README.md +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/setup.cfg +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_async.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_auth/_identity.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_auth/_providers.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_auth/_zapros_handler.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_iter.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/add_tags_to_on_premises_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_application_revisions.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_applications.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_deployment_groups.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_deployment_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_deployment_targets.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_deployments.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/batch_get_on_premises_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/continue_deployment.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/create_application.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/create_deployment.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/create_deployment_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/create_deployment_group.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/delete_application.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/delete_deployment_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/delete_deployment_group.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/delete_git_hub_account_token.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/delete_resources_by_external_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/deregister_on_premises_instance.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_application.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_application_revision.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_deployment.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_deployment_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_deployment_group.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_deployment_instance.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_deployment_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/get_on_premises_instance.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_application_revisions.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_applications.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_deployment_configs.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_deployment_groups.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_deployment_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_deployment_targets.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_deployments.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_git_hub_account_token_names.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_on_premises_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/list_tags_for_resource.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/put_lifecycle_event_hook_execution_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/register_application_revision.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/register_on_premises_instance.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/remove_tags_from_on_premises_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/skip_wait_time_for_instance_termination.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/stop_deployment.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/tag_resource.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/untag_resource.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/update_application.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_operations/code_deploy_20141006/update_deployment_group.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_pagination.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_protocol/__init__.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_protocol/errors.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_protocol/serialize.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_protocol/xml.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_rule_engine/__init__.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_rule_engine/_aws_partition.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_rule_engine/_endpoint_rule_set.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_rule_engine/_endpoint_runtime.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_services/_aws_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_services/async_code_deploy.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/_services/code_deploy.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/__init__.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/_base.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/alarms_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/application_already_exists_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/application_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/application_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/application_name_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/arn_not_supported_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/batch_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/bucket_name_filter_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_already_completed_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_config_already_exists_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_config_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_config_in_use_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_config_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_config_name_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_group_already_exists_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_group_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_group_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_group_name_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_id_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_is_not_in_ready_state_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_not_started_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_target_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_target_id_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/deployment_target_list_size_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/description_too_long_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/ecs_service_mapping_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/git_hub_account_token_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/git_hub_account_token_name_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/iam_arn_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/iam_session_arn_already_registered_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/iam_user_arn_already_registered_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/iam_user_arn_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_id_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_name_already_registered_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_name_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/instance_not_registered_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_alarm_config_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_application_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_arn_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_auto_rollback_config_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_auto_scaling_group_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_blue_green_deployment_configuration_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_bucket_name_filter_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_compute_platform_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployed_state_filter_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_config_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_group_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_id_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_instance_type_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_status_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_style_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_target_id_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_deployment_wait_type_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_ec2_tag_combination_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_ec2_tag_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_ecs_service_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_external_id_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_file_exists_behavior_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_git_hub_account_token_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_git_hub_account_token_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_iam_session_arn_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_iam_user_arn_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_ignore_application_stop_failures_value_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_input_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_instance_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_instance_status_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_instance_type_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_key_prefix_filter_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_lifecycle_event_hook_execution_id_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_lifecycle_event_hook_execution_status_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_load_balancer_info_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_minimum_healthy_host_value_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_next_token_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_on_premises_tag_combination_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_operation_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_registration_status_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_revision_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_role_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_sort_by_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_sort_order_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_tag_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_tag_filter_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_tags_to_add_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_target_filter_name_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_target_group_pair_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_target_instances_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_time_range_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_traffic_routing_configuration_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_trigger_config_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_update_outdated_instances_only_value_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/invalid_zonal_deployment_configuration_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/lifecycle_event_already_completed_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/lifecycle_hook_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/multiple_iam_arns_provided_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/operation_not_supported_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/resource_arn_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/resource_validation_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/revision_does_not_exist_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/revision_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/role_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/tag_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/tag_required_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/tag_set_list_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/throttling_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/trigger_targets_limit_exceeded_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/errors/unsupported_action_for_deployment_type_exception.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/py.typed +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/_prelude/blob.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/_prelude/timestamp.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/add_tags_to_on_premises_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/additional_deployment_status_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/alarm.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/alarm_configuration.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/alarm_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/alarm_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/app_spec_content.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/application_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/application_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/application_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/application_revision_sort_by.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/applications_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/applications_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_rollback_configuration.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_rollback_event.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_rollback_events_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_scaling_group.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_scaling_group_hook.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_scaling_group_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_scaling_group_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/auto_scaling_group_name_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_application_revisions_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_application_revisions_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_applications_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_applications_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_groups_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_groups_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_instances_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_targets_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployment_targets_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployments_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_deployments_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_on_premises_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/batch_get_on_premises_instances_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/blue_green_deployment_configuration.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/blue_instance_termination_option.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/boolean.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/bundle_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/cloud_formation_resource_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/cloud_formation_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/commit_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/compute_platform.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/continue_deployment_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_application_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_application_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_config_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_config_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_group_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_group_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/create_deployment_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_application_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_deployment_config_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_deployment_group_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_deployment_group_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_git_hub_account_token_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_git_hub_account_token_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_resources_by_external_id_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/delete_resources_by_external_id_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_config_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_config_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_config_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_configs_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_creator.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_group_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_group_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_group_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_group_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_groups_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_option.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_overview.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_ready_action.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_ready_option.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_status_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_status_message_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_style.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_target_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_target_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployment_wait_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployments_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deployments_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/deregister_on_premises_instance_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/description.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/diagnostics.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/duration.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/e_tag.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ec2_tag_filter.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ec2_tag_filter_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ec2_tag_filter_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ec2_tag_set.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ec2_tag_set_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_cluster_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_service.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_service_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_service_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_task_set.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_task_set_count.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_task_set_identifier.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_task_set_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/ecs_task_set_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/elb_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/elb_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/elb_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/error_code.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/error_information.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/error_message.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/external_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/file_exists_behavior.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/filter_value.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/filter_value_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/generic_revision_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_application_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_application_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_application_revision_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_application_revision_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_config_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_config_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_group_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_group_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_instance_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_instance_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_target_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_deployment_target_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_on_premises_instance_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/get_on_premises_instance_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/git_hub_account_token_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/git_hub_account_token_name_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/git_hub_location.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/green_fleet_provisioning_action.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/green_fleet_provisioning_option.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/iam_session_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/iam_user_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_action.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_count.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_name_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_status_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_summary.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_summary_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instance_type_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/instances_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/key.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lambda_function_alias.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lambda_function_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lambda_function_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lambda_target.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/last_deployment_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_error_code.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_event.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_event_hook_execution_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_event_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_event_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_event_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/lifecycle_message.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_application_revisions_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_application_revisions_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_applications_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_applications_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_configs_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_configs_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_groups_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_groups_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_instances_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_targets_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployment_targets_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployments_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_deployments_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_git_hub_account_token_names_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_git_hub_account_token_names_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_on_premises_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_on_premises_instances_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_state_filter_action.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_tags_for_resource_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/list_tags_for_resource_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/listener_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/listener_arn_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/load_balancer_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/log_tail.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/message.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts_per_zone.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts_per_zone_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts_per_zone_value.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/minimum_healthy_hosts_value.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/next_token.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/nullable_boolean.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/on_premises_tag_set.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/on_premises_tag_set_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/outdated_instances_strategy.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/percentage.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/put_lifecycle_event_hook_execution_status_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/put_lifecycle_event_hook_execution_status_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/raw_string.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/raw_string_content.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/raw_string_sha256.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/register_application_revision_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/register_on_premises_instance_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/registration_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/related_deployments.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/remove_tags_from_on_premises_instances_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/repository.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/revision_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/revision_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/revision_location.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/revision_location_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/revision_location_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/role.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/rollback_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/s3_bucket.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/s3_key.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/s3_location.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/script_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/skip_wait_time_for_instance_termination_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/sort_order.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/stop_deployment_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/stop_deployment_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/stop_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_filter.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_filter_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_filter_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_key_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_resource_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/tag_resource_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_filter_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_filters.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_group_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_group_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_group_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_group_pair_info.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_group_pair_info_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_id_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_instances.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_label.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/target_status.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/time.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/time_based_canary.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/time_based_linear.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/time_range.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/timestamp.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/traffic_route.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/traffic_routing_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/traffic_routing_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/traffic_weight.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_config_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_event_type.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_event_type_list.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_name.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/trigger_target_arn.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/untag_resource_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/untag_resource_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/update_application_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/update_deployment_group_input.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/update_deployment_group_output.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/value.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/version.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/version_id.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/wait_time_in_mins.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/wait_time_in_seconds.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy/types/zonal_config.py +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy.egg-info/dependency_links.txt +0 -0
- {capo_codedeploy-0.1.0 → capo_codedeploy-0.3.0}/src/capo_codedeploy.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: capo-codedeploy
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Python SDK for Codedeploy.
|
|
5
5
|
Classifier: Development Status :: 4 - Beta
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -19,6 +19,8 @@ Description-Content-Type: text/markdown
|
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
Requires-Dist: jmespath>=1.0
|
|
21
21
|
Requires-Dist: zapros>=0.13.0
|
|
22
|
+
Provides-Extra: anyio
|
|
23
|
+
Requires-Dist: anyio>=3.0; extra == "anyio"
|
|
22
24
|
Provides-Extra: sso
|
|
23
25
|
Requires-Dist: capo-sso>=0.2.0; extra == "sso"
|
|
24
26
|
Requires-Dist: capo-sso-oidc>=0.2.0; extra == "sso"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "capo-codedeploy"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.3.0"
|
|
4
4
|
description = "Python SDK for Codedeploy."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -24,6 +24,8 @@ dependencies = [
|
|
|
24
24
|
]
|
|
25
25
|
|
|
26
26
|
[project.optional-dependencies]
|
|
27
|
+
# Async file request bodies via Body.async_from_path
|
|
28
|
+
anyio = ["anyio>=3.0"]
|
|
27
29
|
# IAM Identity Center (SSO), assume-role and web-identity credentials providers
|
|
28
30
|
sso = [
|
|
29
31
|
"capo-sso>=0.2.0",
|
|
@@ -48,6 +48,7 @@ from ._auth._providers import (
|
|
|
48
48
|
)
|
|
49
49
|
from ._auth._signers import Signer as Signer
|
|
50
50
|
from ._auth._signers import SigV4Signer as SigV4Signer
|
|
51
|
+
from ._body import Body as Body
|
|
51
52
|
from ._services._pipeline import (
|
|
52
53
|
AsyncOperationOptions as AsyncOperationOptions,
|
|
53
54
|
)
|
|
@@ -7,7 +7,7 @@ from zapros import Request
|
|
|
7
7
|
|
|
8
8
|
from capo_codedeploy._auth._identity import Credentials, Identity
|
|
9
9
|
from capo_codedeploy._auth._providers import IdentityProvider
|
|
10
|
-
from capo_codedeploy._auth._sigv4 import SigV4AuthContext, sign_sigv4
|
|
10
|
+
from capo_codedeploy._auth._sigv4 import S3_SIGNING_NAMES, SigV4AuthContext, sign_sigv4
|
|
11
11
|
|
|
12
12
|
IdentityT = TypeVar("IdentityT", bound="Identity")
|
|
13
13
|
|
|
@@ -30,14 +30,25 @@ class SigV4Signer(Signer[Credentials]):
|
|
|
30
30
|
The full auth scheme (``name`` variant, ``signingName``, ``signingRegion``,
|
|
31
31
|
encoding/normalization flags) is provided by the caller — either from the
|
|
32
32
|
endpoint rule-set's ``authSchemes`` property or built by the generated
|
|
33
|
-
``get_signer`` from operation defaults.
|
|
33
|
+
``get_signer`` from operation defaults. ``unsigned_payload`` mirrors the
|
|
34
|
+
operation's ``aws.auth#unsignedPayload`` trait: the body is sent but left
|
|
35
|
+
out of the signature. ``event_stream`` marks a request event stream: the
|
|
36
|
+
request is signed with the ``STREAMING-AWS4-HMAC-SHA256-EVENTS`` payload
|
|
37
|
+
marker and every event with a signature chained from it.
|
|
34
38
|
"""
|
|
35
39
|
|
|
36
40
|
def __init__(
|
|
37
|
-
self,
|
|
41
|
+
self,
|
|
42
|
+
provider: IdentityProvider[Credentials],
|
|
43
|
+
*,
|
|
44
|
+
auth_scheme: dict[str, Any],
|
|
45
|
+
unsigned_payload: bool = False,
|
|
46
|
+
event_stream: bool = False,
|
|
38
47
|
) -> None:
|
|
39
48
|
super().__init__(provider)
|
|
40
49
|
self._auth_scheme = auth_scheme
|
|
50
|
+
self._unsigned_payload = unsigned_payload
|
|
51
|
+
self._event_stream = event_stream
|
|
41
52
|
|
|
42
53
|
async def asign(self, req: Request) -> Request:
|
|
43
54
|
creds = await self.provider.aresolve_identity()
|
|
@@ -55,13 +66,24 @@ class SigV4Signer(Signer[Credentials]):
|
|
|
55
66
|
"disableNormalizePath", False
|
|
56
67
|
),
|
|
57
68
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
body
|
|
64
|
-
|
|
69
|
+
unsigned_payload = self._unsigned_payload
|
|
70
|
+
if (
|
|
71
|
+
not unsigned_payload
|
|
72
|
+
and not self._event_stream
|
|
73
|
+
and req.body is not None
|
|
74
|
+
and not isinstance(req.body, bytes)
|
|
75
|
+
):
|
|
76
|
+
if self._auth_scheme["signingName"] in S3_SIGNING_NAMES:
|
|
77
|
+
# S3 accepts UNSIGNED-PAYLOAD for any operation; streamed bodies rely on it.
|
|
78
|
+
unsigned_payload = True
|
|
79
|
+
else:
|
|
80
|
+
raise NotImplementedError(
|
|
81
|
+
"Currently we don't support signed chunked payloads, so buffer the body and "
|
|
82
|
+
"pass bytes as a workaround; chunked signed implementation coming soon"
|
|
83
|
+
)
|
|
84
|
+
return sign_sigv4(
|
|
85
|
+
req, ctx, unsigned_payload=unsigned_payload, event_stream=self._event_stream
|
|
86
|
+
)
|
|
65
87
|
|
|
66
88
|
def sign(self, req: Request) -> Request:
|
|
67
89
|
creds = self.provider.resolve_identity()
|
|
@@ -79,10 +101,21 @@ class SigV4Signer(Signer[Credentials]):
|
|
|
79
101
|
"disableNormalizePath", False
|
|
80
102
|
),
|
|
81
103
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
body
|
|
88
|
-
|
|
104
|
+
unsigned_payload = self._unsigned_payload
|
|
105
|
+
if (
|
|
106
|
+
not unsigned_payload
|
|
107
|
+
and not self._event_stream
|
|
108
|
+
and req.body is not None
|
|
109
|
+
and not isinstance(req.body, bytes)
|
|
110
|
+
):
|
|
111
|
+
if self._auth_scheme["signingName"] in S3_SIGNING_NAMES:
|
|
112
|
+
# S3 accepts UNSIGNED-PAYLOAD for any operation; streamed bodies rely on it.
|
|
113
|
+
unsigned_payload = True
|
|
114
|
+
else:
|
|
115
|
+
raise NotImplementedError(
|
|
116
|
+
"Currently we don't support signed chunked payloads, so buffer the body and "
|
|
117
|
+
"pass bytes as a workaround; chunked signed implementation coming soon"
|
|
118
|
+
)
|
|
119
|
+
return sign_sigv4(
|
|
120
|
+
req, ctx, unsigned_payload=unsigned_payload, event_stream=self._event_stream
|
|
121
|
+
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""AWS Signature Version 4 — single-chunk signing.
|
|
1
|
+
"""AWS Signature Version 4 — single-chunk and event-stream signing.
|
|
2
2
|
|
|
3
3
|
Reference:
|
|
4
4
|
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-create-signed-request.html
|
|
@@ -15,7 +15,8 @@ import functools
|
|
|
15
15
|
import hashlib
|
|
16
16
|
import hmac
|
|
17
17
|
import re
|
|
18
|
-
from
|
|
18
|
+
from collections.abc import AsyncIterator, Iterator
|
|
19
|
+
from typing import Any, Literal, TypedDict, cast
|
|
19
20
|
from urllib.parse import quote, unquote
|
|
20
21
|
|
|
21
22
|
import zapros
|
|
@@ -23,6 +24,9 @@ from pywhatwgurl import URLSearchParams
|
|
|
23
24
|
from zapros import Headers, Request
|
|
24
25
|
from zapros._utils import get_host_header_value
|
|
25
26
|
|
|
27
|
+
from .._iter import AnyIterator
|
|
28
|
+
from .._protocol.eventstream import HeaderValue, Message, encode_headers
|
|
29
|
+
|
|
26
30
|
|
|
27
31
|
def build_sigv4_auth_scheme(
|
|
28
32
|
signing_name: str, region: str | None, endpoint_scheme: dict[str, Any] | None = None
|
|
@@ -65,6 +69,10 @@ class SigV4AuthContext(TypedDict):
|
|
|
65
69
|
|
|
66
70
|
|
|
67
71
|
_SIGV4_ALGORITHM = "AWS4-HMAC-SHA256"
|
|
72
|
+
# Per-event algorithm and request payload marker of a signed event stream.
|
|
73
|
+
_EVENT_ALGORITHM = "AWS4-HMAC-SHA256-PAYLOAD"
|
|
74
|
+
_EVENT_STREAM_PAYLOAD = "STREAMING-AWS4-HMAC-SHA256-EVENTS"
|
|
75
|
+
_AMZ_DATE_FORMAT = "%Y%m%dT%H%M%SZ"
|
|
68
76
|
_EMPTY_PAYLOAD_SHA256 = hashlib.sha256(b"").hexdigest()
|
|
69
77
|
|
|
70
78
|
# Headers excluded from the signed-headers set. Mirrors botocore's denylist:
|
|
@@ -95,9 +103,11 @@ _UNSIGNED_HEADERS = frozenset(
|
|
|
95
103
|
|
|
96
104
|
_MULTI_SPACE = re.compile(r" +")
|
|
97
105
|
|
|
98
|
-
# Services that require the payload hash to travel in ``x-amz-content-sha256
|
|
99
|
-
#
|
|
100
|
-
|
|
106
|
+
# Services that require the payload hash to travel in ``x-amz-content-sha256``
|
|
107
|
+
# on every request, and that accept ``UNSIGNED-PAYLOAD`` for any operation.
|
|
108
|
+
# Other services sign the hash into the canonical request without sending it,
|
|
109
|
+
# and only see the header when the payload is left unsigned.
|
|
110
|
+
S3_SIGNING_NAMES = frozenset({"s3", "s3express", "s3-outposts", "s3-object-lambda"})
|
|
101
111
|
|
|
102
112
|
|
|
103
113
|
def _uri_encode(value: str) -> str:
|
|
@@ -231,12 +241,20 @@ def _canonical_query_from_pairs(pairs: list[tuple[str, str]]) -> str:
|
|
|
231
241
|
def sign_sigv4(
|
|
232
242
|
request: Request,
|
|
233
243
|
ctx: SigV4AuthContext,
|
|
234
|
-
|
|
244
|
+
*,
|
|
245
|
+
unsigned_payload: bool = False,
|
|
246
|
+
event_stream: bool = False,
|
|
235
247
|
) -> Request:
|
|
236
248
|
"""Return a new ``Request`` carrying SigV4 single-chunk auth headers.
|
|
237
249
|
|
|
238
|
-
|
|
239
|
-
|
|
250
|
+
The payload hash covers ``request.body``, which must be ``bytes`` or
|
|
251
|
+
``None``. ``unsigned_payload`` signs ``UNSIGNED-PAYLOAD`` instead and
|
|
252
|
+
forwards any body unchanged (streaming S3 requests and operations carrying
|
|
253
|
+
``aws.auth#unsignedPayload``). ``event_stream`` signs a request event
|
|
254
|
+
stream: the ``STREAMING-AWS4-HMAC-SHA256-EVENTS`` marker stands in for the
|
|
255
|
+
payload hash and the body — an iterator of encoded event messages — is
|
|
256
|
+
wrapped in an :class:`EventStreamIterator` that signs every event with a
|
|
257
|
+
signature chained from this request's.
|
|
240
258
|
"""
|
|
241
259
|
service = ctx["signing_name"]
|
|
242
260
|
region = ctx["signing_region"]
|
|
@@ -250,21 +268,31 @@ def sign_sigv4(
|
|
|
250
268
|
date_stamp = amz_date[:8]
|
|
251
269
|
else:
|
|
252
270
|
now = _amz_now()
|
|
253
|
-
amz_date = now.strftime(
|
|
271
|
+
amz_date = now.strftime(_AMZ_DATE_FORMAT)
|
|
254
272
|
date_stamp = now.strftime("%Y%m%d")
|
|
255
273
|
headers["X-Amz-Date"] = amz_date
|
|
256
274
|
|
|
257
|
-
# Payload hash. For S3-family services, x-amz-content-sha256 is mandatory
|
|
258
|
-
#
|
|
275
|
+
# Payload hash. For S3-family services, x-amz-content-sha256 is mandatory;
|
|
276
|
+
# for every service it is the only way to announce an unsigned payload or
|
|
277
|
+
# an event stream.
|
|
278
|
+
# Either way it must be set BEFORE computing the canonical request (it
|
|
279
|
+
# gets signed).
|
|
259
280
|
payload_hash = headers.get("X-Amz-Content-SHA256")
|
|
260
281
|
if payload_hash is None:
|
|
261
|
-
if
|
|
282
|
+
if event_stream:
|
|
283
|
+
payload_hash = _EVENT_STREAM_PAYLOAD
|
|
284
|
+
elif unsigned_payload:
|
|
262
285
|
payload_hash = "UNSIGNED-PAYLOAD"
|
|
286
|
+
elif request.body is None:
|
|
287
|
+
payload_hash = _EMPTY_PAYLOAD_SHA256
|
|
288
|
+
elif isinstance(request.body, bytes):
|
|
289
|
+
payload_hash = hashlib.sha256(request.body).hexdigest()
|
|
263
290
|
else:
|
|
264
|
-
|
|
265
|
-
|
|
291
|
+
raise TypeError(
|
|
292
|
+
"sign_sigv4 hashes a bytes body only; pass unsigned_payload=True "
|
|
293
|
+
"to send a streamed body without a payload hash"
|
|
266
294
|
)
|
|
267
|
-
if service in
|
|
295
|
+
if service in S3_SIGNING_NAMES or unsigned_payload or event_stream:
|
|
268
296
|
headers["X-Amz-Content-SHA256"] = payload_hash
|
|
269
297
|
|
|
270
298
|
# Session token (STS / assumed-role credentials).
|
|
@@ -308,18 +336,135 @@ def sign_sigv4(
|
|
|
308
336
|
f"Signature={signature}"
|
|
309
337
|
)
|
|
310
338
|
|
|
311
|
-
|
|
312
|
-
if
|
|
339
|
+
body = request.body
|
|
340
|
+
if event_stream:
|
|
341
|
+
if not isinstance(body, (Iterator, AsyncIterator)):
|
|
342
|
+
raise TypeError(
|
|
343
|
+
"event_stream requires an iterator of encoded events as the body"
|
|
344
|
+
)
|
|
345
|
+
body = EventStreamIterator(
|
|
346
|
+
cast("Iterator[bytes] | AsyncIterator[bytes]", body), ctx, signature
|
|
347
|
+
)
|
|
348
|
+
if body is not None:
|
|
313
349
|
return Request(
|
|
314
350
|
request.url,
|
|
315
351
|
request.method,
|
|
316
352
|
headers,
|
|
317
|
-
body=
|
|
353
|
+
body=body,
|
|
318
354
|
context=request.context,
|
|
319
355
|
)
|
|
320
356
|
return Request(request.url, request.method, headers, context=request.context)
|
|
321
357
|
|
|
322
358
|
|
|
359
|
+
def _sign_event(
|
|
360
|
+
ctx: SigV4AuthContext, prior_signature: str, payload: bytes
|
|
361
|
+
) -> tuple[bytes, str]:
|
|
362
|
+
"""Wrap one encoded event in a signed outer message.
|
|
363
|
+
|
|
364
|
+
Returns ``(frame, signature)``; the hex signature seeds the next event.
|
|
365
|
+
The string to sign chains every frame to its predecessor — the first one
|
|
366
|
+
to the request's ``Authorization`` signature — so the service can verify
|
|
367
|
+
the stream incrementally::
|
|
368
|
+
|
|
369
|
+
AWS4-HMAC-SHA256-PAYLOAD
|
|
370
|
+
<date, YYYYMMDDTHHMMSSZ>
|
|
371
|
+
<credential scope>
|
|
372
|
+
<prior signature, hex>
|
|
373
|
+
<hex sha256 of the encoded ``:date`` header>
|
|
374
|
+
<hex sha256 of the payload>
|
|
375
|
+
|
|
376
|
+
The AWS SDKs (and the service) use the ``-PAYLOAD`` algorithm name; the
|
|
377
|
+
Transcribe developer guide's pseudocode omits the suffix.
|
|
378
|
+
"""
|
|
379
|
+
service = ctx["signing_name"]
|
|
380
|
+
region = ctx["signing_region"]
|
|
381
|
+
now = _amz_now()
|
|
382
|
+
amz_date = now.strftime(_AMZ_DATE_FORMAT)
|
|
383
|
+
date_stamp = amz_date[:8]
|
|
384
|
+
credential_scope = f"{date_stamp}/{region}/{service}/aws4_request"
|
|
385
|
+
date_header: dict[str, HeaderValue] = {":date": now}
|
|
386
|
+
string_to_sign = "\n".join(
|
|
387
|
+
(
|
|
388
|
+
_EVENT_ALGORITHM,
|
|
389
|
+
amz_date,
|
|
390
|
+
credential_scope,
|
|
391
|
+
prior_signature,
|
|
392
|
+
hashlib.sha256(encode_headers(date_header)).hexdigest(),
|
|
393
|
+
hashlib.sha256(payload).hexdigest(),
|
|
394
|
+
)
|
|
395
|
+
)
|
|
396
|
+
signing_key = _derive_signing_key(
|
|
397
|
+
ctx["secret_access_key"], date_stamp, region, service
|
|
398
|
+
)
|
|
399
|
+
signature = hmac.new(
|
|
400
|
+
signing_key, string_to_sign.encode("utf-8"), hashlib.sha256
|
|
401
|
+
).hexdigest()
|
|
402
|
+
frame = Message(
|
|
403
|
+
{**date_header, ":chunk-signature": bytes.fromhex(signature)}, payload
|
|
404
|
+
).encode()
|
|
405
|
+
return frame, signature
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
class EventStreamIterator(AnyIterator[bytes]):
|
|
409
|
+
"""Sign a request event stream, one frame per event.
|
|
410
|
+
|
|
411
|
+
Wraps an iterator of encoded event messages (as produced by the generated
|
|
412
|
+
``serialize_event_*`` functions). Each event becomes the payload of an
|
|
413
|
+
outer message carrying ``:date`` and ``:chunk-signature`` headers, the
|
|
414
|
+
signature chained from the previous frame's and seeded by the request's
|
|
415
|
+
``Authorization`` signature. Once the events are exhausted, one empty
|
|
416
|
+
signed frame is yielded to mark the end of the stream.
|
|
417
|
+
|
|
418
|
+
Like :class:`~capo._body.Body`, it is both a sync and an async iterator:
|
|
419
|
+
iterate it the way the wrapped source is iterable (``next`` over a sync
|
|
420
|
+
source, ``async for`` over an async one).
|
|
421
|
+
|
|
422
|
+
Reference:
|
|
423
|
+
https://docs.aws.amazon.com/transcribe/latest/dg/streaming-setting-up.html
|
|
424
|
+
"""
|
|
425
|
+
|
|
426
|
+
def __init__(
|
|
427
|
+
self,
|
|
428
|
+
events: Iterator[bytes] | AsyncIterator[bytes],
|
|
429
|
+
ctx: SigV4AuthContext,
|
|
430
|
+
seed_signature: str,
|
|
431
|
+
) -> None:
|
|
432
|
+
self._events = events
|
|
433
|
+
self._ctx = ctx
|
|
434
|
+
self._prior_signature = seed_signature
|
|
435
|
+
self._ended = False
|
|
436
|
+
|
|
437
|
+
def _frame(self, payload: bytes) -> bytes:
|
|
438
|
+
frame, self._prior_signature = _sign_event(
|
|
439
|
+
self._ctx, self._prior_signature, payload
|
|
440
|
+
)
|
|
441
|
+
return frame
|
|
442
|
+
|
|
443
|
+
def __next__(self) -> bytes:
|
|
444
|
+
if self._ended:
|
|
445
|
+
raise StopIteration
|
|
446
|
+
if not isinstance(self._events, Iterator):
|
|
447
|
+
raise TypeError("this event stream wraps an async source; use `async for`")
|
|
448
|
+
try:
|
|
449
|
+
payload = next(cast(Iterator[bytes], self._events))
|
|
450
|
+
except StopIteration:
|
|
451
|
+
self._ended = True
|
|
452
|
+
payload = b""
|
|
453
|
+
return self._frame(payload)
|
|
454
|
+
|
|
455
|
+
async def __anext__(self) -> bytes:
|
|
456
|
+
if self._ended:
|
|
457
|
+
raise StopAsyncIteration
|
|
458
|
+
if not isinstance(self._events, AsyncIterator):
|
|
459
|
+
raise TypeError("this event stream wraps a sync source; use `for`")
|
|
460
|
+
try:
|
|
461
|
+
payload = await cast(AsyncIterator[bytes], self._events).__anext__()
|
|
462
|
+
except StopAsyncIteration:
|
|
463
|
+
self._ended = True
|
|
464
|
+
payload = b""
|
|
465
|
+
return self._frame(payload)
|
|
466
|
+
|
|
467
|
+
|
|
323
468
|
def presign_sigv4(
|
|
324
469
|
request: Request,
|
|
325
470
|
ctx: SigV4AuthContext,
|
|
@@ -346,7 +491,7 @@ def presign_sigv4(
|
|
|
346
491
|
service = ctx["signing_name"]
|
|
347
492
|
region = ctx["signing_region"]
|
|
348
493
|
|
|
349
|
-
amz_date = sign_time.strftime(
|
|
494
|
+
amz_date = sign_time.strftime(_AMZ_DATE_FORMAT)
|
|
350
495
|
date_stamp = sign_time.strftime("%Y%m%d")
|
|
351
496
|
credential_scope = f"{date_stamp}/{region}/{service}/aws4_request"
|
|
352
497
|
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"""Request body abstraction for streaming operations.
|
|
2
|
+
|
|
3
|
+
Hand-written, not regenerated.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
from collections.abc import AsyncIterator, Callable, Iterator
|
|
10
|
+
from contextlib import (
|
|
11
|
+
AbstractAsyncContextManager,
|
|
12
|
+
AbstractContextManager,
|
|
13
|
+
asynccontextmanager,
|
|
14
|
+
contextmanager,
|
|
15
|
+
)
|
|
16
|
+
from typing import TYPE_CHECKING, Generic, TypeVar, Union, cast
|
|
17
|
+
|
|
18
|
+
from ._iter import AnyIterator
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
import anyio
|
|
22
|
+
else:
|
|
23
|
+
try:
|
|
24
|
+
import anyio
|
|
25
|
+
except ImportError:
|
|
26
|
+
anyio = None
|
|
27
|
+
|
|
28
|
+
_CHUNK_SIZE = 64 * 1024
|
|
29
|
+
|
|
30
|
+
TStream = TypeVar("TStream", Iterator[bytes], AsyncIterator[bytes])
|
|
31
|
+
|
|
32
|
+
# The opener yields the fresh stream together with its length, or ``None`` when
|
|
33
|
+
# no stream could be produced (an exhausted or non-rewindable source, or logic
|
|
34
|
+
# that decides dynamically it cannot reopen). Pairing the length with each open
|
|
35
|
+
# lets it change between rebuilds instead of being fixed for the whole body.
|
|
36
|
+
_ContextManager = Union[
|
|
37
|
+
AbstractContextManager[Union[tuple[TStream, int], None]],
|
|
38
|
+
AbstractAsyncContextManager[Union[tuple[TStream, int], None]],
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class Body(AnyIterator[bytes], Generic[TStream]):
|
|
43
|
+
"""A replayable request body whose length travels with each open.
|
|
44
|
+
|
|
45
|
+
A plain ``Iterator[bytes]`` can be sent only once, so a failed request
|
|
46
|
+
cannot be retried. A ``Body`` instead holds an *opener* — a context manager
|
|
47
|
+
that opens a fresh stream over the same source — and rebuilds the stream
|
|
48
|
+
before every attempt, closing whatever was left of the previous one.
|
|
49
|
+
|
|
50
|
+
``TStream`` is ``Iterator[bytes]`` for bodies built with :meth:`from_path`
|
|
51
|
+
and ``AsyncIterator[bytes]`` for :meth:`async_from_path`; the former use
|
|
52
|
+
``rebuild()``/``close()``, the latter ``arebuild()``/``aclose()``.
|
|
53
|
+
``build_request`` rebuilds before every attempt.
|
|
54
|
+
|
|
55
|
+
Each open produces ``(stream, length)`` together, so the length is not bound
|
|
56
|
+
to the whole body and may differ from one rebuild to the next. A rebuild is
|
|
57
|
+
also not guaranteed to succeed: the source may be exhausted or
|
|
58
|
+
non-rewindable, so the opener can yield ``None`` and :meth:`rebuild` then
|
|
59
|
+
returns ``None`` instead of a pair. Callers check the return value::
|
|
60
|
+
|
|
61
|
+
for attempt in range(max_attempts):
|
|
62
|
+
opened = body.rebuild()
|
|
63
|
+
if opened is None:
|
|
64
|
+
raise RuntimeError("body could not be rebuilt")
|
|
65
|
+
stream, length = opened
|
|
66
|
+
send(stream, length)
|
|
67
|
+
|
|
68
|
+
``length`` also holds the current stream's length as an attribute (``None``
|
|
69
|
+
before the first rebuild). Iterating a ``Body`` reads its current stream.
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(self, opener: Callable[[], _ContextManager[TStream]]) -> None:
|
|
73
|
+
self._opener = opener
|
|
74
|
+
self._cm: _ContextManager[TStream] | None = None
|
|
75
|
+
self._stream: TStream | None = None
|
|
76
|
+
self.length: int | None = None
|
|
77
|
+
|
|
78
|
+
@classmethod
|
|
79
|
+
def from_path(
|
|
80
|
+
cls, path: str | os.PathLike[str], chunk_size: int = _CHUNK_SIZE
|
|
81
|
+
) -> Body[Iterator[bytes]]:
|
|
82
|
+
"""A body that reads ``path`` in ``chunk_size`` chunks, reopening it (and re-measuring it) on every rebuild."""
|
|
83
|
+
|
|
84
|
+
@contextmanager
|
|
85
|
+
def open_() -> Iterator[tuple[Iterator[bytes], int]]:
|
|
86
|
+
with open(path, "rb") as file:
|
|
87
|
+
length = os.fstat(file.fileno()).st_size
|
|
88
|
+
yield iter(lambda: file.read(chunk_size), b""), length
|
|
89
|
+
|
|
90
|
+
return Body(open_)
|
|
91
|
+
|
|
92
|
+
@classmethod
|
|
93
|
+
def async_from_path(
|
|
94
|
+
cls, path: str | os.PathLike[str], chunk_size: int = _CHUNK_SIZE
|
|
95
|
+
) -> Body[AsyncIterator[bytes]]:
|
|
96
|
+
"""The async counterpart of :meth:`from_path`; needs ``anyio`` installed."""
|
|
97
|
+
if anyio is None:
|
|
98
|
+
dist = (__package__ or "capo").replace("_", "-")
|
|
99
|
+
raise RuntimeError(
|
|
100
|
+
"Body.async_from_path() requires the anyio package; "
|
|
101
|
+
f"reinstall with the anyio feature enabled: {dist}[anyio]"
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
@asynccontextmanager
|
|
105
|
+
async def open_() -> AsyncIterator[tuple[AsyncIterator[bytes], int]]:
|
|
106
|
+
async with await anyio.open_file(path, "rb") as file:
|
|
107
|
+
length = os.fstat(file.wrapped.fileno()).st_size
|
|
108
|
+
|
|
109
|
+
async def chunks() -> AsyncIterator[bytes]:
|
|
110
|
+
while chunk := await file.read(chunk_size):
|
|
111
|
+
yield chunk
|
|
112
|
+
|
|
113
|
+
yield chunks(), length
|
|
114
|
+
|
|
115
|
+
return Body(open_)
|
|
116
|
+
|
|
117
|
+
@property
|
|
118
|
+
def stream(self) -> TStream | None:
|
|
119
|
+
"""The current open stream, or ``None`` if none is open (before the first
|
|
120
|
+
rebuild, or after a close).
|
|
121
|
+
|
|
122
|
+
``build_request`` reuses a non-``None`` stream instead of rebuilding, so
|
|
123
|
+
the retry layer stays in control of when a fresh stream is created.
|
|
124
|
+
"""
|
|
125
|
+
return self._stream
|
|
126
|
+
|
|
127
|
+
def rebuild(self: Body[Iterator[bytes]]) -> tuple[Iterator[bytes], int] | None:
|
|
128
|
+
"""Reopen the stream, closing any previous one, and return ``(stream, length)``.
|
|
129
|
+
|
|
130
|
+
``None`` if the source could not be reopened.
|
|
131
|
+
"""
|
|
132
|
+
self.close()
|
|
133
|
+
cm = self._opener()
|
|
134
|
+
if not isinstance(cm, AbstractContextManager):
|
|
135
|
+
raise TypeError(
|
|
136
|
+
"this Body has an async opener; use it with the async client (arebuild/aclose)"
|
|
137
|
+
)
|
|
138
|
+
cm = cast(AbstractContextManager["tuple[Iterator[bytes], int] | None"], cm)
|
|
139
|
+
opened = cm.__enter__()
|
|
140
|
+
if opened is None:
|
|
141
|
+
cm.__exit__(None, None, None)
|
|
142
|
+
return None
|
|
143
|
+
stream, length = opened
|
|
144
|
+
self._stream, self.length, self._cm = stream, length, cm
|
|
145
|
+
return stream, length
|
|
146
|
+
|
|
147
|
+
async def arebuild(
|
|
148
|
+
self: Body[AsyncIterator[bytes]],
|
|
149
|
+
) -> tuple[AsyncIterator[bytes], int] | None:
|
|
150
|
+
"""Async :meth:`rebuild`, returning ``(stream, length)`` or ``None``."""
|
|
151
|
+
await self.aclose()
|
|
152
|
+
cm = self._opener()
|
|
153
|
+
if not isinstance(cm, AbstractAsyncContextManager):
|
|
154
|
+
raise TypeError(
|
|
155
|
+
"this Body has a sync opener; use it with the sync client (rebuild/close)"
|
|
156
|
+
)
|
|
157
|
+
cm = cast(
|
|
158
|
+
AbstractAsyncContextManager["tuple[AsyncIterator[bytes], int] | None"], cm
|
|
159
|
+
)
|
|
160
|
+
opened = await cm.__aenter__()
|
|
161
|
+
if opened is None:
|
|
162
|
+
await cm.__aexit__(None, None, None)
|
|
163
|
+
return None
|
|
164
|
+
stream, length = opened
|
|
165
|
+
self._stream, self.length, self._cm = stream, length, cm
|
|
166
|
+
return stream, length
|
|
167
|
+
|
|
168
|
+
def close(self: Body[Iterator[bytes]]) -> None:
|
|
169
|
+
cm, self._cm, self._stream, self.length = self._cm, None, None, None
|
|
170
|
+
if cm is not None:
|
|
171
|
+
cast(AbstractContextManager[object], cm).__exit__(None, None, None)
|
|
172
|
+
|
|
173
|
+
async def aclose(self: Body[AsyncIterator[bytes]]) -> None:
|
|
174
|
+
cm, self._cm, self._stream, self.length = self._cm, None, None, None
|
|
175
|
+
if cm is not None:
|
|
176
|
+
await cast(AbstractAsyncContextManager[object], cm).__aexit__(
|
|
177
|
+
None, None, None
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
def __next__(self) -> bytes:
|
|
181
|
+
if self._stream is None:
|
|
182
|
+
raise RuntimeError("body has no open stream; call rebuild() first")
|
|
183
|
+
return next(cast(Iterator[bytes], self._stream))
|
|
184
|
+
|
|
185
|
+
async def __anext__(self) -> bytes:
|
|
186
|
+
if self._stream is None:
|
|
187
|
+
raise RuntimeError("body has no open stream; call rebuild() first")
|
|
188
|
+
return await cast(AsyncIterator[bytes], self._stream).__anext__()
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
@contextmanager
|
|
192
|
+
def closing_bodies(inp: object) -> Iterator[None]:
|
|
193
|
+
"""Close every :class:`Body` in a request input when the operation finishes.
|
|
194
|
+
|
|
195
|
+
The operation method wraps its whole run (request build across retries, plus
|
|
196
|
+
response handling) in this, so a ``Body``'s stream is released once — and only
|
|
197
|
+
once — the operation is done. Non-``Body`` values (bytes, plain iterators,
|
|
198
|
+
``StaticAnyIterator``) are left untouched.
|
|
199
|
+
"""
|
|
200
|
+
try:
|
|
201
|
+
yield
|
|
202
|
+
finally:
|
|
203
|
+
if isinstance(inp, dict):
|
|
204
|
+
for value in inp.values():
|
|
205
|
+
if isinstance(value, Body):
|
|
206
|
+
cast("Body[Iterator[bytes]]", value).close()
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
@asynccontextmanager
|
|
210
|
+
async def aclosing_bodies(inp: object) -> AsyncIterator[None]:
|
|
211
|
+
"""Async :func:`closing_bodies`, awaiting :meth:`Body.aclose`."""
|
|
212
|
+
try:
|
|
213
|
+
yield
|
|
214
|
+
finally:
|
|
215
|
+
if isinstance(inp, dict):
|
|
216
|
+
for value in inp.values():
|
|
217
|
+
if isinstance(value, Body):
|
|
218
|
+
await cast("Body[AsyncIterator[bytes]]", value).aclose()
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
__all__ = ["Body", "aclosing_bodies", "closing_bodies"]
|