capo-keyspaces 0.4.0__tar.gz → 0.6.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.
Files changed (182) hide show
  1. {capo_keyspaces-0.4.0/src/capo_keyspaces.egg-info → capo_keyspaces-0.6.0}/PKG-INFO +2 -2
  2. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/pyproject.toml +2 -2
  3. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_auth/_sigv4.py +9 -9
  4. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/create_keyspace.py +5 -1
  5. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/create_table.py +5 -1
  6. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/create_type.py +5 -1
  7. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/delete_keyspace.py +5 -1
  8. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/delete_table.py +5 -1
  9. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/delete_type.py +5 -1
  10. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/get_keyspace.py +5 -1
  11. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/get_table.py +5 -1
  12. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/get_table_auto_scaling_settings.py +5 -1
  13. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/get_type.py +5 -1
  14. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/list_keyspaces.py +5 -1
  15. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/list_tables.py +5 -1
  16. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/list_tags_for_resource.py +5 -1
  17. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/list_types.py +5 -1
  18. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/restore_table.py +5 -1
  19. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/tag_resource.py +5 -1
  20. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/untag_resource.py +5 -1
  21. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/update_keyspace.py +5 -1
  22. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_operations/keyspaces_service/update_table.py +5 -1
  23. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_services/_pipeline.py +2 -0
  24. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_services/async_keyspaces.py +12 -4
  25. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_services/keyspaces.py +12 -4
  26. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0/src/capo_keyspaces.egg-info}/PKG-INFO +2 -2
  27. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces.egg-info/requires.txt +1 -1
  28. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/tests/test_sigv4.py +21 -6
  29. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/LICENSE +0 -0
  30. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/README.md +0 -0
  31. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/setup.cfg +0 -0
  32. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/__init__.py +0 -0
  33. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_async.py +0 -0
  34. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_auth/_identity.py +0 -0
  35. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_auth/_providers.py +0 -0
  36. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_auth/_signers.py +0 -0
  37. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_auth/_zapros_handler.py +0 -0
  38. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_body.py +0 -0
  39. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_iter.py +0 -0
  40. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_pagination.py +0 -0
  41. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_protocol/__init__.py +0 -0
  42. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_protocol/errors.py +0 -0
  43. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_protocol/eventstream.py +0 -0
  44. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_protocol/serialize.py +0 -0
  45. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_protocol/xml.py +0 -0
  46. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_rule_engine/__init__.py +0 -0
  47. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_rule_engine/_aws_partition.py +0 -0
  48. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_rule_engine/_endpoint_rule_set.py +0 -0
  49. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_rule_engine/_endpoint_runtime.py +0 -0
  50. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/_services/_aws_config.py +0 -0
  51. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/__init__.py +0 -0
  52. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/_base.py +0 -0
  53. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/access_denied_exception.py +0 -0
  54. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/conflict_exception.py +0 -0
  55. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/internal_server_exception.py +0 -0
  56. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/resource_not_found_exception.py +0 -0
  57. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/service_quota_exceeded_exception.py +0 -0
  58. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/errors/validation_exception.py +0 -0
  59. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/py.typed +0 -0
  60. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/_prelude/blob.py +0 -0
  61. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/_prelude/timestamp.py +0 -0
  62. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/arn.py +0 -0
  63. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/auto_scaling_policy.py +0 -0
  64. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/auto_scaling_settings.py +0 -0
  65. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/auto_scaling_specification.py +0 -0
  66. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/boolean_object.py +0 -0
  67. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/capacity_specification.py +0 -0
  68. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/capacity_specification_summary.py +0 -0
  69. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/capacity_units.py +0 -0
  70. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/cdc_propagate_tags.py +0 -0
  71. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/cdc_specification.py +0 -0
  72. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/cdc_specification_summary.py +0 -0
  73. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/cdc_status.py +0 -0
  74. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/client_side_timestamps.py +0 -0
  75. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/client_side_timestamps_status.py +0 -0
  76. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/clustering_key.py +0 -0
  77. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/clustering_key_list.py +0 -0
  78. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/column_definition.py +0 -0
  79. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/column_definition_list.py +0 -0
  80. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/comment.py +0 -0
  81. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_keyspace_request.py +0 -0
  82. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_keyspace_response.py +0 -0
  83. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_table_request.py +0 -0
  84. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_table_response.py +0 -0
  85. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_type_request.py +0 -0
  86. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/create_type_response.py +0 -0
  87. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/default_time_to_live.py +0 -0
  88. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_keyspace_request.py +0 -0
  89. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_keyspace_response.py +0 -0
  90. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_table_request.py +0 -0
  91. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_table_response.py +0 -0
  92. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_type_request.py +0 -0
  93. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/delete_type_response.py +0 -0
  94. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/depth.py +0 -0
  95. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/double_object.py +0 -0
  96. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/encryption_specification.py +0 -0
  97. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/encryption_type.py +0 -0
  98. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/field_definition.py +0 -0
  99. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/field_list.py +0 -0
  100. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/generic_string.py +0 -0
  101. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_keyspace_request.py +0 -0
  102. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_keyspace_response.py +0 -0
  103. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_table_auto_scaling_settings_request.py +0 -0
  104. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_table_auto_scaling_settings_response.py +0 -0
  105. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_table_request.py +0 -0
  106. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_table_response.py +0 -0
  107. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_type_request.py +0 -0
  108. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/get_type_response.py +0 -0
  109. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/integer_object.py +0 -0
  110. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/keyspace_name.py +0 -0
  111. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/keyspace_status.py +0 -0
  112. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/keyspace_summary.py +0 -0
  113. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/keyspace_summary_list.py +0 -0
  114. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/kms_key_arn.py +0 -0
  115. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_keyspaces_request.py +0 -0
  116. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_keyspaces_response.py +0 -0
  117. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_tables_request.py +0 -0
  118. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_tables_response.py +0 -0
  119. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_tags_for_resource_request.py +0 -0
  120. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_tags_for_resource_response.py +0 -0
  121. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_types_request.py +0 -0
  122. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/list_types_response.py +0 -0
  123. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/max_results.py +0 -0
  124. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/next_token.py +0 -0
  125. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/partition_key.py +0 -0
  126. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/partition_key_list.py +0 -0
  127. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/point_in_time_recovery.py +0 -0
  128. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/point_in_time_recovery_status.py +0 -0
  129. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/point_in_time_recovery_summary.py +0 -0
  130. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/region.py +0 -0
  131. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/region_list.py +0 -0
  132. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_auto_scaling_specification.py +0 -0
  133. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_auto_scaling_specification_list.py +0 -0
  134. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_specification.py +0 -0
  135. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_specification_list.py +0 -0
  136. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_specification_summary.py +0 -0
  137. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replica_specification_summary_list.py +0 -0
  138. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replication_group_status.py +0 -0
  139. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replication_group_status_list.py +0 -0
  140. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/replication_specification.py +0 -0
  141. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/restore_table_request.py +0 -0
  142. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/restore_table_response.py +0 -0
  143. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/rs.py +0 -0
  144. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/schema_definition.py +0 -0
  145. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/sort_order.py +0 -0
  146. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/static_column.py +0 -0
  147. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/static_column_list.py +0 -0
  148. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/stream_arn.py +0 -0
  149. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/table_name.py +0 -0
  150. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/table_name_list.py +0 -0
  151. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/table_status.py +0 -0
  152. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/table_summary.py +0 -0
  153. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/table_summary_list.py +0 -0
  154. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tables_replication_progress.py +0 -0
  155. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag.py +0 -0
  156. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag_key.py +0 -0
  157. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag_list.py +0 -0
  158. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag_resource_request.py +0 -0
  159. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag_resource_response.py +0 -0
  160. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/tag_value.py +0 -0
  161. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/target_tracking_scaling_policy_configuration.py +0 -0
  162. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/throughput_mode.py +0 -0
  163. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/time_to_live.py +0 -0
  164. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/time_to_live_status.py +0 -0
  165. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/timestamp.py +0 -0
  166. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/type_name.py +0 -0
  167. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/type_name_list.py +0 -0
  168. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/type_status.py +0 -0
  169. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/untag_resource_request.py +0 -0
  170. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/untag_resource_response.py +0 -0
  171. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/update_keyspace_request.py +0 -0
  172. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/update_keyspace_response.py +0 -0
  173. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/update_table_request.py +0 -0
  174. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/update_table_response.py +0 -0
  175. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/view_type.py +0 -0
  176. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/warm_throughput_specification.py +0 -0
  177. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/warm_throughput_specification_summary.py +0 -0
  178. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces/types/warm_throughput_status.py +0 -0
  179. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces.egg-info/SOURCES.txt +0 -0
  180. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces.egg-info/dependency_links.txt +0 -0
  181. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/src/capo_keyspaces.egg-info/top_level.txt +0 -0
  182. {capo_keyspaces-0.4.0 → capo_keyspaces-0.6.0}/tests/test_body.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: capo-keyspaces
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Python SDK for AWS Keyspaces.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Intended Audience :: Developers
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.10
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: zapros>=0.13.0
20
+ Requires-Dist: zapros>=0.21.0
21
21
  Provides-Extra: anyio
22
22
  Requires-Dist: anyio>=3.0; extra == "anyio"
23
23
  Provides-Extra: sso
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "capo-keyspaces"
3
- version = "0.4.0"
3
+ version = "0.6.0"
4
4
  description = "Python SDK for AWS Keyspaces."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -19,7 +19,7 @@ classifiers = [
19
19
  "Typing :: Typed",
20
20
  ]
21
21
  dependencies = [
22
- "zapros>=0.13.0",
22
+ "zapros>=0.21.0",
23
23
  ]
24
24
 
25
25
  [project.optional-dependencies]
@@ -17,7 +17,7 @@ import hmac
17
17
  import re
18
18
  from collections.abc import AsyncIterator, Iterator
19
19
  from typing import Any, Literal, TypedDict, cast
20
- from urllib.parse import quote, unquote
20
+ from urllib.parse import quote
21
21
 
22
22
  import zapros
23
23
  from pywhatwgurl import URLSearchParams
@@ -134,11 +134,11 @@ def _remove_dot_segments(path: str) -> str:
134
134
  def _canonical_path(path: str, *, double_encode: bool, normalize: bool) -> str:
135
135
  """Build CanonicalURI.
136
136
 
137
- Per the SigV4 spec, every segment is URI-encoded; standard services
138
- normalize dot segments and URI-encode each segment **twice**. The
139
- rules-engine ``disableNormalizePath`` / ``disableDoubleEncoding`` flags
140
- turn those steps off — S3-family services set both, so the path is
141
- signed exactly as provided.
137
+ ``path`` is the path as sent on the wire, so it is already URI-encoded
138
+ once. Standard services normalize dot segments and URI-encode each
139
+ segment a second time. The rules-engine ``disableNormalizePath`` /
140
+ ``disableDoubleEncoding`` flags turn those steps off — S3-family
141
+ services set both, so the path is signed exactly as provided.
142
142
  """
143
143
  if not path:
144
144
  return "/"
@@ -148,9 +148,9 @@ def _canonical_path(path: str, *, double_encode: bool, normalize: bool) -> str:
148
148
  path = _remove_dot_segments(path)
149
149
  if not double_encode:
150
150
  return path
151
- decoded = unquote(path)
152
- first = quote(decoded, safe="/~")
153
- return quote(first, safe="/~")
151
+ # Never decode first: that would turn a "%2F" inside a segment (an ARN in
152
+ # a path label) into a separator and leave it out of the second encoding.
153
+ return quote(path, safe="/~")
154
154
 
155
155
 
156
156
  def _canonical_query(query: str) -> str:
@@ -129,7 +129,11 @@ def build_request(
129
129
  allow_nan=False,
130
130
  ).encode()
131
131
  headers["content-type"] = "application/x-amz-json-1.0"
132
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
132
+ signer = (
133
+ None
134
+ if options.anonymous
135
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
136
+ )
133
137
  normalized_url = zapros.URL(url)
134
138
  for k, v in params:
135
139
  normalized_url.search_params.append(k, v)
@@ -144,7 +144,11 @@ def build_request(
144
144
  allow_nan=False,
145
145
  ).encode()
146
146
  headers["content-type"] = "application/x-amz-json-1.0"
147
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
147
+ signer = (
148
+ None
149
+ if options.anonymous
150
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
151
+ )
148
152
  normalized_url = zapros.URL(url)
149
153
  for k, v in params:
150
154
  normalized_url.search_params.append(k, v)
@@ -133,7 +133,11 @@ def build_request(
133
133
  allow_nan=False,
134
134
  ).encode()
135
135
  headers["content-type"] = "application/x-amz-json-1.0"
136
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
136
+ signer = (
137
+ None
138
+ if options.anonymous
139
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
140
+ )
137
141
  normalized_url = zapros.URL(url)
138
142
  for k, v in params:
139
143
  normalized_url.search_params.append(k, v)
@@ -124,7 +124,11 @@ def build_request(
124
124
  allow_nan=False,
125
125
  ).encode()
126
126
  headers["content-type"] = "application/x-amz-json-1.0"
127
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
127
+ signer = (
128
+ None
129
+ if options.anonymous
130
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
131
+ )
128
132
  normalized_url = zapros.URL(url)
129
133
  for k, v in params:
130
134
  normalized_url.search_params.append(k, v)
@@ -124,7 +124,11 @@ def build_request(
124
124
  allow_nan=False,
125
125
  ).encode()
126
126
  headers["content-type"] = "application/x-amz-json-1.0"
127
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
127
+ signer = (
128
+ None
129
+ if options.anonymous
130
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
131
+ )
128
132
  normalized_url = zapros.URL(url)
129
133
  for k, v in params:
130
134
  normalized_url.search_params.append(k, v)
@@ -132,7 +132,11 @@ def build_request(
132
132
  allow_nan=False,
133
133
  ).encode()
134
134
  headers["content-type"] = "application/x-amz-json-1.0"
135
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
135
+ signer = (
136
+ None
137
+ if options.anonymous
138
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
139
+ )
136
140
  normalized_url = zapros.URL(url)
137
141
  for k, v in params:
138
142
  normalized_url.search_params.append(k, v)
@@ -129,7 +129,11 @@ def build_request(
129
129
  allow_nan=False,
130
130
  ).encode()
131
131
  headers["content-type"] = "application/x-amz-json-1.0"
132
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
132
+ signer = (
133
+ None
134
+ if options.anonymous
135
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
136
+ )
133
137
  normalized_url = zapros.URL(url)
134
138
  for k, v in params:
135
139
  normalized_url.search_params.append(k, v)
@@ -138,7 +138,11 @@ def build_request(
138
138
  allow_nan=False,
139
139
  ).encode()
140
140
  headers["content-type"] = "application/x-amz-json-1.0"
141
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
141
+ signer = (
142
+ None
143
+ if options.anonymous
144
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
145
+ )
142
146
  normalized_url = zapros.URL(url)
143
147
  for k, v in params:
144
148
  normalized_url.search_params.append(k, v)
@@ -127,7 +127,11 @@ def build_request(
127
127
  allow_nan=False,
128
128
  ).encode()
129
129
  headers["content-type"] = "application/x-amz-json-1.0"
130
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
130
+ signer = (
131
+ None
132
+ if options.anonymous
133
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
134
+ )
131
135
  normalized_url = zapros.URL(url)
132
136
  for k, v in params:
133
137
  normalized_url.search_params.append(k, v)
@@ -131,7 +131,11 @@ def build_request(
131
131
  allow_nan=False,
132
132
  ).encode()
133
133
  headers["content-type"] = "application/x-amz-json-1.0"
134
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
134
+ signer = (
135
+ None
136
+ if options.anonymous
137
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
138
+ )
135
139
  normalized_url = zapros.URL(url)
136
140
  for k, v in params:
137
141
  normalized_url.search_params.append(k, v)
@@ -128,7 +128,11 @@ def build_request(
128
128
  allow_nan=False,
129
129
  ).encode()
130
130
  headers["content-type"] = "application/x-amz-json-1.0"
131
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
131
+ signer = (
132
+ None
133
+ if options.anonymous
134
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
135
+ )
132
136
  normalized_url = zapros.URL(url)
133
137
  for k, v in params:
134
138
  normalized_url.search_params.append(k, v)
@@ -128,7 +128,11 @@ def build_request(
128
128
  allow_nan=False,
129
129
  ).encode()
130
130
  headers["content-type"] = "application/x-amz-json-1.0"
131
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
131
+ signer = (
132
+ None
133
+ if options.anonymous
134
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
135
+ )
132
136
  normalized_url = zapros.URL(url)
133
137
  for k, v in params:
134
138
  normalized_url.search_params.append(k, v)
@@ -126,7 +126,11 @@ def build_request(
126
126
  allow_nan=False,
127
127
  ).encode()
128
128
  headers["content-type"] = "application/x-amz-json-1.0"
129
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
129
+ signer = (
130
+ None
131
+ if options.anonymous
132
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
133
+ )
130
134
  normalized_url = zapros.URL(url)
131
135
  for k, v in params:
132
136
  normalized_url.search_params.append(k, v)
@@ -128,7 +128,11 @@ def build_request(
128
128
  allow_nan=False,
129
129
  ).encode()
130
130
  headers["content-type"] = "application/x-amz-json-1.0"
131
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
131
+ signer = (
132
+ None
133
+ if options.anonymous
134
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
135
+ )
132
136
  normalized_url = zapros.URL(url)
133
137
  for k, v in params:
134
138
  normalized_url.search_params.append(k, v)
@@ -139,7 +139,11 @@ def build_request(
139
139
  allow_nan=False,
140
140
  ).encode()
141
141
  headers["content-type"] = "application/x-amz-json-1.0"
142
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
142
+ signer = (
143
+ None
144
+ if options.anonymous
145
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
146
+ )
143
147
  normalized_url = zapros.URL(url)
144
148
  for k, v in params:
145
149
  normalized_url.search_params.append(k, v)
@@ -125,7 +125,11 @@ def build_request(
125
125
  allow_nan=False,
126
126
  ).encode()
127
127
  headers["content-type"] = "application/x-amz-json-1.0"
128
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
128
+ signer = (
129
+ None
130
+ if options.anonymous
131
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
132
+ )
129
133
  normalized_url = zapros.URL(url)
130
134
  for k, v in params:
131
135
  normalized_url.search_params.append(k, v)
@@ -125,7 +125,11 @@ def build_request(
125
125
  allow_nan=False,
126
126
  ).encode()
127
127
  headers["content-type"] = "application/x-amz-json-1.0"
128
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
128
+ signer = (
129
+ None
130
+ if options.anonymous
131
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
132
+ )
129
133
  normalized_url = zapros.URL(url)
130
134
  for k, v in params:
131
135
  normalized_url.search_params.append(k, v)
@@ -134,7 +134,11 @@ def build_request(
134
134
  allow_nan=False,
135
135
  ).encode()
136
136
  headers["content-type"] = "application/x-amz-json-1.0"
137
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
137
+ signer = (
138
+ None
139
+ if options.anonymous
140
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
141
+ )
138
142
  normalized_url = zapros.URL(url)
139
143
  for k, v in params:
140
144
  normalized_url.search_params.append(k, v)
@@ -142,7 +142,11 @@ def build_request(
142
142
  allow_nan=False,
143
143
  ).encode()
144
144
  headers["content-type"] = "application/x-amz-json-1.0"
145
- signer = get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
145
+ signer = (
146
+ None
147
+ if options.anonymous
148
+ else get_signer(options, auth_schemes=endpoint.properties.get("authSchemes"))
149
+ )
146
150
  normalized_url = zapros.URL(url)
147
151
  for k, v in params:
148
152
  normalized_url.search_params.append(k, v)
@@ -40,6 +40,7 @@ class OperationOptions:
40
40
  endpoint: str | None = None
41
41
  retry_max_attempts: int | None = None
42
42
  credentials_provider: IdentityProvider[Credentials] | None = None
43
+ anonymous: bool | None = None
43
44
 
44
45
 
45
46
  @dataclass
@@ -51,6 +52,7 @@ class AsyncOperationOptions:
51
52
  endpoint: str | None = None
52
53
  retry_max_attempts: int | None = None
53
54
  credentials_provider: IdentityProvider[Credentials] | None = None
55
+ anonymous: bool | None = None
54
56
 
55
57
 
56
58
  @dataclass
@@ -103,6 +103,7 @@ class AsyncKeyspacesClientConfig(TypedDict, total=False, closed=True):
103
103
  use_fips: bool | None
104
104
  endpoint: str | None
105
105
  credentials_provider: IdentityProvider[Credentials] | None
106
+ anonymous: bool | None
106
107
 
107
108
 
108
109
  class AsyncKeyspacesClient:
@@ -118,6 +119,7 @@ class AsyncKeyspacesClient:
118
119
  endpoint: The value of the ``SDK::Endpoint`` endpoint parameter.
119
120
  credentials: AWS credentials for request signing.
120
121
  credentials_provider: Provider that resolves AWS credentials. Takes precedence over ``credentials``.
122
+ anonymous: Send requests unsigned, without resolving credentials, even for operations that require authentication.
121
123
  """
122
124
 
123
125
  def __init__(
@@ -131,10 +133,14 @@ class AsyncKeyspacesClient:
131
133
  endpoint: str | None = None,
132
134
  credentials: Credentials | None = None,
133
135
  credentials_provider: CredentialsProvider | None = None,
136
+ anonymous: bool | None = None,
134
137
  ):
135
- self._client = AsyncClient(http_handler).wrap_with_middleware(
136
- lambda next: AuthMiddleware(next)
137
- )
138
+ client = AsyncClient(http_handler)
139
+ # The handler the user gave us, or the default one for this environment.
140
+ # The SDK middlewares wrap it below, and the credential resolvers borrow
141
+ # it for their one-off calls.
142
+ raw_handler = client.handler
143
+ self._client = client.wrap_with_middleware(lambda next: AuthMiddleware(next))
138
144
  if credentials is not None and credentials_provider is not None:
139
145
  warnings.warn(
140
146
  "Both credentials and credentials_provider given; provider takes precedence"
@@ -146,7 +152,7 @@ class AsyncKeyspacesClient:
146
152
  resolved_credentials_provider = StaticAwsCredentialsProvider(credentials)
147
153
  if resolved_credentials_provider is None and credentials is None:
148
154
  resolved_credentials_provider = default_aws_credentials_chain(
149
- AsyncClient(http_handler)
155
+ AsyncClient(raw_handler)
150
156
  )
151
157
  self._config = AsyncKeyspacesClientConfig(
152
158
  {
@@ -157,6 +163,7 @@ class AsyncKeyspacesClient:
157
163
  "use_fips": use_fips,
158
164
  "endpoint": endpoint,
159
165
  "credentials_provider": resolved_credentials_provider,
166
+ "anonymous": anonymous,
160
167
  }
161
168
  )
162
169
 
@@ -185,6 +192,7 @@ class AsyncKeyspacesClient:
185
192
  credentials_provider=overrides.get(
186
193
  "credentials_provider", self._config.get("credentials_provider")
187
194
  ),
195
+ anonymous=overrides.get("anonymous", self._config.get("anonymous")),
188
196
  )
189
197
  return interceptors_, options_
190
198
 
@@ -103,6 +103,7 @@ class KeyspacesClientConfig(TypedDict, total=False, closed=True):
103
103
  use_fips: bool | None
104
104
  endpoint: str | None
105
105
  credentials_provider: IdentityProvider[Credentials] | None
106
+ anonymous: bool | None
106
107
 
107
108
 
108
109
  class KeyspacesClient:
@@ -118,6 +119,7 @@ class KeyspacesClient:
118
119
  endpoint: The value of the ``SDK::Endpoint`` endpoint parameter.
119
120
  credentials: AWS credentials for request signing.
120
121
  credentials_provider: Provider that resolves AWS credentials. Takes precedence over ``credentials``.
122
+ anonymous: Send requests unsigned, without resolving credentials, even for operations that require authentication.
121
123
  """
122
124
 
123
125
  def __init__(
@@ -131,10 +133,14 @@ class KeyspacesClient:
131
133
  endpoint: str | None = None,
132
134
  credentials: Credentials | None = None,
133
135
  credentials_provider: CredentialsProvider | None = None,
136
+ anonymous: bool | None = None,
134
137
  ):
135
- self._client = Client(http_handler).wrap_with_middleware(
136
- lambda next: AuthMiddleware(next)
137
- )
138
+ client = Client(http_handler)
139
+ # The handler the user gave us, or the default one for this environment.
140
+ # The SDK middlewares wrap it below, and the credential resolvers borrow
141
+ # it for their one-off calls.
142
+ raw_handler = client.handler
143
+ self._client = client.wrap_with_middleware(lambda next: AuthMiddleware(next))
138
144
  if credentials is not None and credentials_provider is not None:
139
145
  warnings.warn(
140
146
  "Both credentials and credentials_provider given; provider takes precedence"
@@ -146,7 +152,7 @@ class KeyspacesClient:
146
152
  resolved_credentials_provider = StaticAwsCredentialsProvider(credentials)
147
153
  if resolved_credentials_provider is None and credentials is None:
148
154
  resolved_credentials_provider = default_aws_credentials_chain(
149
- Client(http_handler)
155
+ Client(raw_handler)
150
156
  )
151
157
  self._config = KeyspacesClientConfig(
152
158
  {
@@ -157,6 +163,7 @@ class KeyspacesClient:
157
163
  "use_fips": use_fips,
158
164
  "endpoint": endpoint,
159
165
  "credentials_provider": resolved_credentials_provider,
166
+ "anonymous": anonymous,
160
167
  }
161
168
  )
162
169
 
@@ -185,6 +192,7 @@ class KeyspacesClient:
185
192
  credentials_provider=overrides.get(
186
193
  "credentials_provider", self._config.get("credentials_provider")
187
194
  ),
195
+ anonymous=overrides.get("anonymous", self._config.get("anonymous")),
188
196
  )
189
197
  return interceptors_, options_
190
198
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: capo-keyspaces
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Python SDK for AWS Keyspaces.
5
5
  Classifier: Development Status :: 4 - Beta
6
6
  Classifier: Intended Audience :: Developers
@@ -17,7 +17,7 @@ Classifier: Typing :: Typed
17
17
  Requires-Python: >=3.10
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
- Requires-Dist: zapros>=0.13.0
20
+ Requires-Dist: zapros>=0.21.0
21
21
  Provides-Extra: anyio
22
22
  Requires-Dist: anyio>=3.0; extra == "anyio"
23
23
  Provides-Extra: sso
@@ -1,4 +1,4 @@
1
- zapros>=0.13.0
1
+ zapros>=0.21.0
2
2
 
3
3
  [anyio]
4
4
  anyio>=3.0
@@ -91,13 +91,28 @@ class TestCanonicalPath:
91
91
  def test_s3_preserves_dot_segments(self):
92
92
  assert _s3_path("/a/../b/./c") == "/a/../b/./c"
93
93
 
94
- def test_non_s3_double_encodes(self):
95
- # "/foo bar" → first encode → "/foo%20bar" → second → "/foo%2520bar"
96
- assert _std_path("/foo bar") == "/foo%2520bar"
97
-
98
- def test_non_s3_already_encoded_double_encodes(self):
99
- # "/foo%20bar" gets unquoted to "/foo bar", then double-encoded.
94
+ def test_non_s3_encodes_wire_path_once_more(self):
95
+ # The path arrives URI-encoded once ("/foo bar" is sent as "/foo%20bar").
100
96
  assert _std_path("/foo%20bar") == "/foo%2520bar"
97
+ assert _std_path("/a%3Ab/caf%C3%A9~") == "/a%253Ab/caf%25C3%25A9~"
98
+
99
+ def test_non_s3_keeps_encoded_slash_inside_segment(self):
100
+ # An ARN in a path label: its "/" is sent as "%2F" and must stay part
101
+ # of the segment, not become a separator.
102
+ assert (
103
+ _std_path("/model/arn%3Aaws%3Abedrock%3A%3Afoundation-model%2Fx/converse")
104
+ == "/model/arn%253Aaws%253Abedrock%253A%253Afoundation-model%252Fx/converse"
105
+ )
106
+ assert _s3_path("/bucket/a%2Fb") == "/bucket/a%2Fb"
107
+
108
+ def test_non_s3_encodes_literal_reserved_characters_once(self):
109
+ # "@" and "$" appear literally in a few URI templates and are sent as is.
110
+ assert _std_path("/@connections/abc") == "/%40connections/abc"
111
+ assert _std_path("/things/t/jobs/$next") == "/things/t/jobs/%24next"
112
+
113
+ def test_non_s3_does_not_decode_the_wire_path(self):
114
+ assert _std_path("/a%2fb") == "/a%252fb"
115
+ assert _std_path("/a%25b") == "/a%2525b"
101
116
 
102
117
  def test_non_s3_removes_dot_segments(self):
103
118
  # Mirrors botocore's normalize_url_path: "." dropped, ".." pops,
File without changes
File without changes
File without changes