capo-backup 0.1.0__tar.gz → 0.2.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_backup-0.1.0/src/capo_backup.egg-info → capo_backup-0.2.0}/PKG-INFO +3 -1
- {capo_backup-0.1.0 → capo_backup-0.2.0}/pyproject.toml +3 -1
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/__init__.py +1 -0
- capo_backup-0.2.0/src/capo_backup/_body.py +221 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_services/_pipeline.py +51 -2
- {capo_backup-0.1.0 → capo_backup-0.2.0/src/capo_backup.egg-info}/PKG-INFO +3 -1
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup.egg-info/SOURCES.txt +2 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup.egg-info/requires.txt +3 -0
- capo_backup-0.2.0/tests/test_body.py +225 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/LICENSE +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/README.md +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/setup.cfg +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_async.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_auth/_identity.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_auth/_providers.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_auth/_signers.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_auth/_sigv4.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_auth/_zapros_handler.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_iter.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/associate_backup_vault_mpa_approval_team.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/cancel_legal_hold.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_backup_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_backup_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_framework.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_legal_hold.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_logically_air_gapped_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_report_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_restore_access_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_restore_testing_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_restore_testing_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/create_tiering_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_vault_access_policy.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_vault_lock_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_backup_vault_notifications.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_framework.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_recovery_point.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_report_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_restore_testing_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_restore_testing_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/delete_tiering_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_backup_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_copy_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_framework.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_global_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_protected_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_recovery_point.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_region_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_report_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_report_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_restore_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/describe_scan_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/disassociate_backup_vault_mpa_approval_team.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/disassociate_recovery_point.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/disassociate_recovery_point_from_parent.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/export_backup_plan_template.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_plan_from_json.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_plan_from_template.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_vault_access_policy.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_backup_vault_notifications.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_legal_hold.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_pitr_malware_scan_results.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_recovery_point_index_details.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_recovery_point_restore_metadata.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_restore_job_metadata.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_restore_testing_inferred_metadata.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_restore_testing_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_restore_testing_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_supported_resource_types.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/get_tiering_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_job_summaries.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_plan_templates.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_plan_versions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_plans.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_selections.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_backup_vaults.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_copy_job_summaries.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_copy_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_frameworks.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_indexed_recovery_points.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_legal_holds.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_protected_resources.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_protected_resources_by_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_recovery_points_by_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_recovery_points_by_legal_hold.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_recovery_points_by_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_report_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_report_plans.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_access_backup_vaults.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_job_summaries.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_jobs_by_protected_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_testing_plans.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_restore_testing_selections.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_scan_job_summaries.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_scan_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_tags.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/list_tiering_configurations.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/put_backup_vault_access_policy.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/put_backup_vault_lock_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/put_backup_vault_notifications.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/put_restore_validation_result.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/revoke_restore_access_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/start_backup_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/start_copy_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/start_report_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/start_restore_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/start_scan_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/stop_backup_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/tag_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/untag_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_backup_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_framework.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_global_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_recovery_point_index_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_recovery_point_lifecycle.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_region_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_report_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_restore_testing_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_restore_testing_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_operations/cryo_controller_user_manager/update_tiering_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_pagination.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_protocol/__init__.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_protocol/errors.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_protocol/eventstream.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_protocol/serialize.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_protocol/xml.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_rule_engine/__init__.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_rule_engine/_aws_partition.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_rule_engine/_endpoint_rule_set.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_rule_engine/_endpoint_runtime.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_services/_aws_config.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_services/async_backup.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/_services/backup.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/__init__.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/_base.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/already_exists_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/conflict_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/dependency_failure_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/invalid_parameter_value_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/invalid_request_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/invalid_resource_state_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/limit_exceeded_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/missing_parameter_value_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/resource_not_found_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/errors/service_unavailable_exception.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/py.typed +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/_prelude/blob.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/_prelude/timestamp.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/account_id.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/advanced_backup_setting.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/advanced_backup_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/aggregated_scan_result.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/aggregation_period.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/arn.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/associate_backup_vault_mpa_approval_team_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job_child_jobs_in_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job_summary.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_job_summary_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_jobs_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_option_key.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_option_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_options.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan_templates_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan_templates_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plan_versions_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plans_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_plans_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_rule.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_rule_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_rule_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_rules.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_rules_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_selection_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_selections_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_selections_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_event.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_events.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/backup_vault_name_or_wildcard.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/boolean.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/boolean2.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/calculated_lifecycle.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/cancel_legal_hold_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/cancel_legal_hold_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/compliance_resource_id_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition_key.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition_parameter.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition_parameters.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/condition_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/conditions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/control_input_parameter.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/control_input_parameters.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/control_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/control_scope.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_action.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_actions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job_child_jobs_in_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job_summary.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_job_summary_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/copy_jobs_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_selection_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_framework_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_framework_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_legal_hold_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_legal_hold_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_logically_air_gapped_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_logically_air_gapped_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_report_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_report_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_access_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_access_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_testing_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_testing_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_testing_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_restore_testing_selection_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_tiering_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/create_tiering_configuration_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/creator_request_id.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/cron_expression.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/date_range.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_vault_access_policy_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_vault_lock_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_backup_vault_notifications_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_framework_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_recovery_point_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_report_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_restore_testing_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_restore_testing_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_tiering_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/delete_tiering_configuration_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_backup_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_backup_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_copy_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_copy_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_framework_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_framework_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_global_settings_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_global_settings_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_protected_resource_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_protected_resource_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_recovery_point_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_recovery_point_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_region_settings_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_region_settings_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_report_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_report_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_report_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_report_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_restore_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_restore_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_scan_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/describe_scan_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/disassociate_backup_vault_mpa_approval_team_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/disassociate_recovery_point_from_parent_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/disassociate_recovery_point_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/encryption_key_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/export_backup_plan_template_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/export_backup_plan_template_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/format_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework_control.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework_controls.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework_description.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/framework_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_from_json_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_from_json_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_from_template_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_from_template_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_selection_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_vault_access_policy_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_vault_access_policy_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_vault_notifications_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_backup_vault_notifications_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_legal_hold_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_legal_hold_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_pitr_malware_scan_results_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_pitr_malware_scan_results_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_recovery_point_index_details_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_recovery_point_index_details_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_recovery_point_restore_metadata_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_recovery_point_restore_metadata_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_job_metadata_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_job_metadata_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_inferred_metadata_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_inferred_metadata_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_restore_testing_selection_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_supported_resource_types_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_tiering_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/get_tiering_configuration_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/global_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/global_settings_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/global_settings_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/iam_policy.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/iam_role_arn.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/index.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/index_action.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/index_actions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/index_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/indexed_recovery_point.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/indexed_recovery_point_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/integer.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/is_enabled.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/key_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/key_value_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/latest_mpa_approval_team_update.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/latest_revoke_request.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/legal_hold.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/legal_hold_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/legal_holds_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/lifecycle.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/lifecycle_delete_after_event.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_job_summaries_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_job_summaries_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_jobs_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_jobs_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plan_templates_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plan_templates_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plan_versions_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plan_versions_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plans_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_plans_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_selections_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_selections_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_vaults_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_backup_vaults_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_copy_job_summaries_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_copy_job_summaries_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_copy_jobs_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_copy_jobs_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_frameworks_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_frameworks_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_indexed_recovery_points_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_indexed_recovery_points_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_legal_holds_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_legal_holds_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_of_tags.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_protected_resources_by_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_protected_resources_by_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_protected_resources_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_protected_resources_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_backup_vault_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_legal_hold_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_legal_hold_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_resource_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_recovery_points_by_resource_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_report_jobs_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_report_jobs_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_report_plans_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_report_plans_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_access_backup_vaults_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_access_backup_vaults_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_job_summaries_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_job_summaries_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_jobs_by_protected_resource_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_jobs_by_protected_resource_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_jobs_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_jobs_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_plans_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_plans_input_max_results_integer.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_plans_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_selections_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_selections_input_max_results_integer.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_restore_testing_selections_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_scan_job_summaries_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_scan_job_summaries_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_scan_jobs_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_scan_jobs_input_max_results_integer.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_scan_jobs_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_tags_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_tags_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_tiering_configurations_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/list_tiering_configurations_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/long.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/long2.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/malware_scanner.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/max_framework_inputs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/max_results.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/max_scheduled_runs_preview.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/message_category.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/metadata.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/metadata_key.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/metadata_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/mpa_revoke_session_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/mpa_session_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/parameter_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/parameter_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/protected_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/protected_resource_conditions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/protected_resources_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/put_backup_vault_access_policy_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/put_backup_vault_lock_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/put_backup_vault_notifications_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/put_restore_validation_result_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_by_backup_vault.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_by_backup_vault_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_by_resource.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_by_resource_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_creator.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_point_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/recovery_points_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/region.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_delivery_channel.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_destination.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_job_id.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_job_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_plan.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_plan_description.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_plan_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_plan_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/report_setting.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/requester_comment.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_arns.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_identifiers.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_selections.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_type_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_type_management_preference.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_type_opt_in_preference.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/resource_types.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_access_backup_vault_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_access_backup_vault_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_deletion_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_creator.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_id.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_summary.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_job_summary_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_jobs_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_jobs_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_plan_for_create.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_plan_for_get.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_plan_for_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_plan_for_update.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_plans.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_recovery_point_selection.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_recovery_point_selection_algorithm.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_recovery_point_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_recovery_point_type_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_selection_for_create.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_selection_for_get.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_selection_for_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_selection_for_update.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_testing_selections.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/restore_validation_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/revoke_restore_access_backup_vault_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/rule_execution_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_action.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_actions.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_finding.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_findings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job_creator.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job_summary.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_job_summary_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_jobs.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_mode.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_resource_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_result.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_result_info.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_result_status.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_results.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_setting.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_settings.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scan_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scheduled_plan_execution_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/scheduled_runs_preview.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/sensitive_string_map.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_backup_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_backup_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_copy_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_copy_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_report_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_report_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_restore_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_restore_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_scan_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/start_scan_job_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/stop_backup_job_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/storage_class.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/string.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/string_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/string_map.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tag_key.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tag_key_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tag_resource_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tag_value.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tags.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configuration.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configuration_input_for_create.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configuration_input_for_update.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configuration_name.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configurations_list.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_configurations_list_member.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/tiering_down_settings_in_days.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/timestamp.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/timezone.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/untag_resource_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_backup_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_backup_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_framework_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_framework_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_global_settings_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_recovery_point_index_settings_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_recovery_point_index_settings_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_recovery_point_lifecycle_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_recovery_point_lifecycle_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_region_settings_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_report_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_report_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_restore_testing_plan_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_restore_testing_plan_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_restore_testing_selection_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_restore_testing_selection_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_tiering_configuration_input.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/update_tiering_configuration_output.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/vault_names.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/vault_state.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/vault_type.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup/types/window_minutes.py +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup.egg-info/dependency_links.txt +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/src/capo_backup.egg-info/top_level.txt +0 -0
- {capo_backup-0.1.0 → capo_backup-0.2.0}/tests/test_sigv4.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: capo-backup
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Python SDK for Backup.
|
|
5
5
|
Classifier: Development Status :: 4 - Beta
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -18,6 +18,8 @@ Requires-Python: >=3.10
|
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
Requires-Dist: zapros>=0.13.0
|
|
21
|
+
Provides-Extra: anyio
|
|
22
|
+
Requires-Dist: anyio>=3.0; extra == "anyio"
|
|
21
23
|
Provides-Extra: sso
|
|
22
24
|
Requires-Dist: capo-sso>=0.2.0; extra == "sso"
|
|
23
25
|
Requires-Dist: capo-sso-oidc>=0.2.0; extra == "sso"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "capo-backup"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.2.0"
|
|
4
4
|
description = "Python SDK for Backup."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -23,6 +23,8 @@ dependencies = [
|
|
|
23
23
|
]
|
|
24
24
|
|
|
25
25
|
[project.optional-dependencies]
|
|
26
|
+
# Async file request bodies via Body.async_from_path
|
|
27
|
+
anyio = ["anyio>=3.0"]
|
|
26
28
|
# IAM Identity Center (SSO), assume-role and web-identity credentials providers
|
|
27
29
|
sso = [
|
|
28
30
|
"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
|
)
|
|
@@ -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"]
|
|
@@ -2,20 +2,24 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import random
|
|
4
4
|
import time
|
|
5
|
-
from collections.abc import Sequence
|
|
5
|
+
from collections.abc import AsyncIterator, Iterator, Sequence
|
|
6
6
|
from dataclasses import dataclass
|
|
7
|
-
from typing import TYPE_CHECKING, Awaitable, Callable, Generic, TypeVar
|
|
7
|
+
from typing import TYPE_CHECKING, Awaitable, Callable, Generic, TypeVar, cast
|
|
8
8
|
|
|
9
9
|
from zapros import (
|
|
10
10
|
AsyncClient,
|
|
11
11
|
Client,
|
|
12
12
|
ConnectionError,
|
|
13
|
+
ConnectTimeoutError,
|
|
14
|
+
PoolTimeoutError,
|
|
13
15
|
Response,
|
|
14
16
|
SSLError,
|
|
15
17
|
TimeoutError,
|
|
16
18
|
)
|
|
17
19
|
|
|
18
20
|
from capo_backup._async import anysleep
|
|
21
|
+
from capo_backup._body import Body
|
|
22
|
+
from capo_backup._iter import StaticAnyIterator
|
|
19
23
|
from capo_backup.errors import ServiceError
|
|
20
24
|
|
|
21
25
|
if TYPE_CHECKING:
|
|
@@ -141,6 +145,43 @@ def _is_retryable(exc: Exception) -> bool:
|
|
|
141
145
|
return False
|
|
142
146
|
|
|
143
147
|
|
|
148
|
+
def _is_pre_transmission(exc: Exception) -> bool:
|
|
149
|
+
# True when the request body was certainly not written before the error,
|
|
150
|
+
# so the same stream can be reused as-is. A bare ConnectionError is
|
|
151
|
+
# ambiguous ("cannot be established or is lost"), so it does not qualify.
|
|
152
|
+
return isinstance(exc, (ConnectTimeoutError, PoolTimeoutError))
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def _prepare_retry(inp: object) -> bool:
|
|
156
|
+
if not isinstance(inp, dict):
|
|
157
|
+
return True
|
|
158
|
+
for value in inp.values():
|
|
159
|
+
if isinstance(value, Body):
|
|
160
|
+
value = cast(Body[Iterator[bytes]], value)
|
|
161
|
+
if value.rebuild() is None:
|
|
162
|
+
return False
|
|
163
|
+
elif isinstance(value, StaticAnyIterator):
|
|
164
|
+
continue
|
|
165
|
+
elif isinstance(value, (Iterator, AsyncIterator)):
|
|
166
|
+
return False
|
|
167
|
+
return True
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
async def _aprepare_retry(inp: object) -> bool:
|
|
171
|
+
if not isinstance(inp, dict):
|
|
172
|
+
return True
|
|
173
|
+
for value in inp.values():
|
|
174
|
+
if isinstance(value, Body):
|
|
175
|
+
value = cast(Body[AsyncIterator[bytes]], value)
|
|
176
|
+
if await value.arebuild() is None:
|
|
177
|
+
return False
|
|
178
|
+
elif isinstance(value, StaticAnyIterator):
|
|
179
|
+
continue
|
|
180
|
+
elif isinstance(value, (Iterator, AsyncIterator)):
|
|
181
|
+
return False
|
|
182
|
+
return True
|
|
183
|
+
|
|
184
|
+
|
|
144
185
|
def _retry_delay(attempt: int, is_throttling: bool) -> float:
|
|
145
186
|
base = 1.0 if is_throttling else 0.5
|
|
146
187
|
delay = base * (2.0 ** min(attempt - 1, 10))
|
|
@@ -162,6 +203,10 @@ def retry() -> Interceptor[TInput, TOutput]:
|
|
|
162
203
|
raise
|
|
163
204
|
last_exc = exc
|
|
164
205
|
if attempt < max_attempts:
|
|
206
|
+
if not _is_pre_transmission(exc) and not _prepare_retry(
|
|
207
|
+
request.input
|
|
208
|
+
):
|
|
209
|
+
raise
|
|
165
210
|
is_throttling = (
|
|
166
211
|
isinstance(exc, ServiceError) and exc.is_throttling_error
|
|
167
212
|
)
|
|
@@ -187,6 +232,10 @@ def aretry() -> AsyncInterceptor[TInput, TOutput]:
|
|
|
187
232
|
raise
|
|
188
233
|
last_exc = exc
|
|
189
234
|
if attempt < max_attempts:
|
|
235
|
+
if not _is_pre_transmission(exc) and not await _aprepare_retry(
|
|
236
|
+
request.input
|
|
237
|
+
):
|
|
238
|
+
raise
|
|
190
239
|
is_throttling = (
|
|
191
240
|
isinstance(exc, ServiceError) and exc.is_throttling_error
|
|
192
241
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: capo-backup
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Python SDK for Backup.
|
|
5
5
|
Classifier: Development Status :: 4 - Beta
|
|
6
6
|
Classifier: Intended Audience :: Developers
|
|
@@ -18,6 +18,8 @@ Requires-Python: >=3.10
|
|
|
18
18
|
Description-Content-Type: text/markdown
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
Requires-Dist: zapros>=0.13.0
|
|
21
|
+
Provides-Extra: anyio
|
|
22
|
+
Requires-Dist: anyio>=3.0; extra == "anyio"
|
|
21
23
|
Provides-Extra: sso
|
|
22
24
|
Requires-Dist: capo-sso>=0.2.0; extra == "sso"
|
|
23
25
|
Requires-Dist: capo-sso-oidc>=0.2.0; extra == "sso"
|
|
@@ -3,6 +3,7 @@ README.md
|
|
|
3
3
|
pyproject.toml
|
|
4
4
|
src/capo_backup/__init__.py
|
|
5
5
|
src/capo_backup/_async.py
|
|
6
|
+
src/capo_backup/_body.py
|
|
6
7
|
src/capo_backup/_iter.py
|
|
7
8
|
src/capo_backup/_pagination.py
|
|
8
9
|
src/capo_backup/py.typed
|
|
@@ -563,4 +564,5 @@ src/capo_backup/types/vault_type.py
|
|
|
563
564
|
src/capo_backup/types/window_minutes.py
|
|
564
565
|
src/capo_backup/types/_prelude/blob.py
|
|
565
566
|
src/capo_backup/types/_prelude/timestamp.py
|
|
567
|
+
tests/test_body.py
|
|
566
568
|
tests/test_sigv4.py
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"""Body: replayable streaming request bodies."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncIterator, Iterator
|
|
6
|
+
from contextlib import asynccontextmanager, contextmanager
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from capo_backup._body import Body
|
|
12
|
+
from capo_backup._iter import AnyIterator, ensure_async_iterator, ensure_sync_iterator
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@pytest.fixture
|
|
16
|
+
def data_file(tmp_path: Path) -> Path:
|
|
17
|
+
path = tmp_path / "data.bin"
|
|
18
|
+
path.write_bytes(b"0123456789" * 3)
|
|
19
|
+
return path
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_from_path_reads_in_chunks(data_file: Path) -> None:
|
|
23
|
+
body = Body.from_path(data_file, chunk_size=10)
|
|
24
|
+
assert body.length is None # not known until the first open
|
|
25
|
+
opened = body.rebuild()
|
|
26
|
+
assert opened is not None
|
|
27
|
+
stream, length = opened
|
|
28
|
+
assert length == 30
|
|
29
|
+
assert body.length == 30
|
|
30
|
+
assert list(stream) == [b"0123456789"] * 3
|
|
31
|
+
body.close()
|
|
32
|
+
assert body.length is None # cleared on close
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_rebuild_returns_stream_and_length(data_file: Path) -> None:
|
|
36
|
+
body = Body.from_path(data_file, chunk_size=10)
|
|
37
|
+
opened = body.rebuild()
|
|
38
|
+
assert opened is not None
|
|
39
|
+
stream, length = opened
|
|
40
|
+
assert stream is body.stream
|
|
41
|
+
assert length == 30
|
|
42
|
+
body.close()
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def test_length_can_change_between_rebuilds(data_file: Path) -> None:
|
|
46
|
+
body = Body.from_path(data_file, chunk_size=10)
|
|
47
|
+
first = body.rebuild()
|
|
48
|
+
assert first is not None and first[1] == 30
|
|
49
|
+
data_file.write_bytes(b"shorter") # source shrinks between attempts
|
|
50
|
+
second = body.rebuild()
|
|
51
|
+
assert second is not None and second[1] == 7
|
|
52
|
+
assert body.length == 7
|
|
53
|
+
body.close()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def test_rebuild_replays_a_consumed_stream(data_file: Path) -> None:
|
|
57
|
+
body = Body.from_path(data_file, chunk_size=10)
|
|
58
|
+
first = body.rebuild()
|
|
59
|
+
assert first is not None
|
|
60
|
+
assert next(first[0]) == b"0123456789"
|
|
61
|
+
second = body.rebuild()
|
|
62
|
+
assert second is not None
|
|
63
|
+
assert b"".join(second[0]) == data_file.read_bytes()
|
|
64
|
+
body.close()
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_rebuild_closes_the_previous_stream(data_file: Path) -> None:
|
|
68
|
+
body = Body.from_path(data_file)
|
|
69
|
+
opened = body.rebuild()
|
|
70
|
+
assert opened is not None
|
|
71
|
+
first = opened[0]
|
|
72
|
+
again = body.rebuild()
|
|
73
|
+
assert again is not None and first is not again[0]
|
|
74
|
+
with pytest.raises(ValueError): # the file behind the first stream is closed
|
|
75
|
+
next(first)
|
|
76
|
+
body.close()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def test_stream_is_none_before_rebuild_and_after_close(data_file: Path) -> None:
|
|
80
|
+
body = Body.from_path(data_file)
|
|
81
|
+
assert body.stream is None
|
|
82
|
+
body.rebuild()
|
|
83
|
+
assert body.stream is not None
|
|
84
|
+
body.close()
|
|
85
|
+
assert body.stream is None
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_iterating_an_unopened_body_raises(data_file: Path) -> None:
|
|
89
|
+
with pytest.raises(RuntimeError):
|
|
90
|
+
next(Body.from_path(data_file))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_close_without_stream_is_a_noop(data_file: Path) -> None:
|
|
94
|
+
Body.from_path(data_file).close()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_body_is_an_any_iterator_over_its_stream(data_file: Path) -> None:
|
|
98
|
+
body = Body.from_path(data_file, chunk_size=10)
|
|
99
|
+
assert isinstance(body, AnyIterator)
|
|
100
|
+
assert ensure_sync_iterator(body) is body
|
|
101
|
+
body.rebuild()
|
|
102
|
+
assert list(body) == [b"0123456789"] * 3
|
|
103
|
+
body.close()
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_rebuild_returns_none_when_opener_yields_none() -> None:
|
|
107
|
+
@contextmanager
|
|
108
|
+
def opener() -> Iterator[tuple[Iterator[bytes], int] | None]:
|
|
109
|
+
yield None
|
|
110
|
+
|
|
111
|
+
body: Body[Iterator[bytes]] = Body(opener)
|
|
112
|
+
assert body.rebuild() is None
|
|
113
|
+
assert body.length is None
|
|
114
|
+
assert body.stream is None # nothing was opened
|
|
115
|
+
body.close()
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_async_from_path(data_file: Path) -> None:
|
|
119
|
+
anyio = pytest.importorskip("anyio")
|
|
120
|
+
|
|
121
|
+
async def main() -> None:
|
|
122
|
+
body = Body.async_from_path(data_file, chunk_size=10)
|
|
123
|
+
assert body.length is None
|
|
124
|
+
assert ensure_async_iterator(body) is body
|
|
125
|
+
opened = await body.arebuild()
|
|
126
|
+
assert opened is not None
|
|
127
|
+
stream, length = opened
|
|
128
|
+
assert length == 30
|
|
129
|
+
assert body.length == 30
|
|
130
|
+
assert [chunk async for chunk in stream] == [b"0123456789"] * 3
|
|
131
|
+
await body.arebuild()
|
|
132
|
+
assert [chunk async for chunk in body] == [b"0123456789"] * 3
|
|
133
|
+
await body.aclose()
|
|
134
|
+
assert body.stream is None
|
|
135
|
+
|
|
136
|
+
anyio.run(main)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_arebuild_returns_none_when_opener_yields_none() -> None:
|
|
140
|
+
anyio = pytest.importorskip("anyio")
|
|
141
|
+
|
|
142
|
+
@asynccontextmanager
|
|
143
|
+
async def opener() -> AsyncIterator[tuple[AsyncIterator[bytes], int] | None]:
|
|
144
|
+
yield None
|
|
145
|
+
|
|
146
|
+
async def main() -> None:
|
|
147
|
+
body: Body[AsyncIterator[bytes]] = Body(opener)
|
|
148
|
+
assert await body.arebuild() is None
|
|
149
|
+
assert body.length is None
|
|
150
|
+
assert body.stream is None
|
|
151
|
+
await body.aclose()
|
|
152
|
+
|
|
153
|
+
anyio.run(main)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def test_rebuild_on_an_async_opener_raises_a_clear_typeerror() -> None:
|
|
157
|
+
# The guard is for untyped callers who reach a sync Body method with an
|
|
158
|
+
# async opener; typed code cannot construct this pairing.
|
|
159
|
+
@asynccontextmanager
|
|
160
|
+
async def opener() -> AsyncIterator[tuple[AsyncIterator[bytes], int]]:
|
|
161
|
+
async def chunks() -> AsyncIterator[bytes]:
|
|
162
|
+
yield b"x"
|
|
163
|
+
|
|
164
|
+
yield chunks(), 1
|
|
165
|
+
|
|
166
|
+
body: Body[Iterator[bytes]] = Body(opener)
|
|
167
|
+
with pytest.raises(TypeError, match="async opener"):
|
|
168
|
+
body.rebuild()
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def test_arebuild_on_a_sync_opener_raises_a_clear_typeerror() -> None:
|
|
172
|
+
anyio = pytest.importorskip("anyio")
|
|
173
|
+
|
|
174
|
+
@contextmanager
|
|
175
|
+
def opener() -> Iterator[tuple[Iterator[bytes], int]]:
|
|
176
|
+
yield iter([b"x"]), 1
|
|
177
|
+
|
|
178
|
+
async def main() -> None:
|
|
179
|
+
body: Body[AsyncIterator[bytes]] = Body(opener)
|
|
180
|
+
with pytest.raises(TypeError, match="sync opener"):
|
|
181
|
+
await body.arebuild()
|
|
182
|
+
|
|
183
|
+
anyio.run(main)
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_custom_opener() -> None:
|
|
187
|
+
opened = 0
|
|
188
|
+
|
|
189
|
+
@contextmanager
|
|
190
|
+
def opener() -> Iterator[tuple[Iterator[bytes], int]]:
|
|
191
|
+
nonlocal opened
|
|
192
|
+
opened += 1
|
|
193
|
+
yield iter([b"ab", b"cd"]), 4
|
|
194
|
+
|
|
195
|
+
body: Body[Iterator[bytes]] = Body(opener)
|
|
196
|
+
body.rebuild()
|
|
197
|
+
result = body.rebuild()
|
|
198
|
+
assert opened == 2
|
|
199
|
+
assert result is not None
|
|
200
|
+
stream, length = result
|
|
201
|
+
assert stream is body.stream and length == 4
|
|
202
|
+
assert b"".join(stream) == b"abcd"
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def test_custom_async_opener() -> None:
|
|
206
|
+
anyio = pytest.importorskip("anyio")
|
|
207
|
+
|
|
208
|
+
@asynccontextmanager
|
|
209
|
+
async def opener() -> AsyncIterator[tuple[AsyncIterator[bytes], int]]:
|
|
210
|
+
async def chunks() -> AsyncIterator[bytes]:
|
|
211
|
+
yield b"ab"
|
|
212
|
+
yield b"cd"
|
|
213
|
+
|
|
214
|
+
yield chunks(), 4
|
|
215
|
+
|
|
216
|
+
async def main() -> None:
|
|
217
|
+
body: Body[AsyncIterator[bytes]] = Body(opener)
|
|
218
|
+
opened = await body.arebuild()
|
|
219
|
+
assert opened is not None
|
|
220
|
+
stream, length = opened
|
|
221
|
+
assert length == 4
|
|
222
|
+
assert b"".join([chunk async for chunk in stream]) == b"abcd"
|
|
223
|
+
await body.aclose()
|
|
224
|
+
|
|
225
|
+
anyio.run(main)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|