otdf-python 0.3.1__tar.gz → 0.3.3__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 (255) hide show
  1. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/check_entitlements.sh +8 -1
  2. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/build-python.yaml +0 -3
  3. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/platform-integration-test.yaml +1 -0
  4. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/release-please.yaml +3 -3
  5. otdf_python-0.3.3/.release-please-manifest.json +3 -0
  6. otdf_python-0.3.3/CHANGELOG.md +33 -0
  7. {otdf_python-0.3.1 → otdf_python-0.3.3}/PKG-INFO +6 -82
  8. {otdf_python-0.3.1 → otdf_python-0.3.3}/README.md +5 -81
  9. otdf_python-0.3.3/docs/CONNECT_RPC.md +156 -0
  10. otdf_python-0.3.3/docs/DEVELOPING.md +95 -0
  11. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/README.md +2 -2
  12. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/pyproject.toml +1 -1
  13. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/build_connect_proto.sh +1 -1
  14. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/uv.lock +1 -1
  15. {otdf_python-0.3.1 → otdf_python-0.3.3}/pyproject.toml +1 -1
  16. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/cli.py +3 -11
  17. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk.py +8 -22
  18. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_pe_interaction.py +1 -1
  19. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_validate_otdf_python.py +1 -7
  20. {otdf_python-0.3.1 → otdf_python-0.3.3}/uv.lock +1 -1
  21. otdf_python-0.3.1/.release-please-manifest.json +0 -3
  22. otdf_python-0.3.1/CHANGELOG.md +0 -28
  23. otdf_python-0.3.1/docs/CONNECT_RPC_MIGRATION.md +0 -283
  24. otdf_python-0.3.1/docs/DEVELOPING.md +0 -18
  25. otdf_python-0.3.1/docs/PROTOBUF_SETUP.md +0 -135
  26. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/start_opentdf_docker.sh +0 -0
  27. {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/test-suite.yaml +0 -0
  28. {otdf_python-0.3.1 → otdf_python-0.3.3}/.gitignore +0 -0
  29. {otdf_python-0.3.1 → otdf_python-0.3.3}/.pre-commit-config.yaml +0 -0
  30. {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-config-develop.json +0 -0
  31. {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-config.json +0 -0
  32. {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-manifest-develop.json +0 -0
  33. {otdf_python-0.3.1 → otdf_python-0.3.3}/.vscode/extensions.json +0 -0
  34. {otdf_python-0.3.1 → otdf_python-0.3.3}/.vscode/settings.json +0 -0
  35. {otdf_python-0.3.1 → otdf_python-0.3.3}/LICENSE +0 -0
  36. {otdf_python-0.3.1 → otdf_python-0.3.3}/conftest.py +0 -0
  37. {otdf_python-0.3.1 → otdf_python-0.3.3}/docs/LEGACY_VERSION.md +0 -0
  38. {otdf_python-0.3.1 → otdf_python-0.3.3}/docs/RELEASES.md +0 -0
  39. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.gen.yaml +0 -0
  40. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.lock +0 -0
  41. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.yaml +0 -0
  42. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/authorization/authorization.proto +0 -0
  43. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/authorization/v2/authorization.proto +0 -0
  44. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/common/common.proto +0 -0
  45. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entity/entity.proto +0 -0
  46. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto +0 -0
  47. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto +0 -0
  48. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/kas/kas.proto +0 -0
  49. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/logger/audit/test.proto +0 -0
  50. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/actions/actions.proto +0 -0
  51. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/attributes/attributes.proto +0 -0
  52. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto +0 -0
  53. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto +0 -0
  54. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto +0 -0
  55. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/objects.proto +0 -0
  56. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto +0 -0
  57. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto +0 -0
  58. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/selectors.proto +0 -0
  59. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto +0 -0
  60. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto +0 -0
  61. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto +0 -0
  62. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/generate_connect_proto.py +0 -0
  63. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/setup_connect_rpc.py +0 -0
  64. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/__init__.py +0 -0
  65. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py +0 -0
  66. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py +0 -0
  67. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi +0 -0
  68. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2_connect.py +0 -0
  69. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py +0 -0
  70. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi +0 -0
  71. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -0
  72. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/__init__.py +0 -0
  73. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py +0 -0
  74. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi +0 -0
  75. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/__init__.py +0 -0
  76. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py +0 -0
  77. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi +0 -0
  78. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py +0 -0
  79. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py +0 -0
  80. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi +0 -0
  81. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -0
  82. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py +0 -0
  83. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi +0 -0
  84. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -0
  85. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/__init__.py +0 -0
  86. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py +0 -0
  87. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi +0 -0
  88. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2_connect.py +0 -0
  89. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py +0 -0
  90. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py +0 -0
  91. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py +0 -0
  92. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py +0 -0
  93. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py +0 -0
  94. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py +0 -0
  95. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py +0 -0
  96. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py +0 -0
  97. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py +0 -0
  98. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py +0 -0
  99. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py +0 -0
  100. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py +0 -0
  101. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py +0 -0
  102. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py +0 -0
  103. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py +0 -0
  104. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py +0 -0
  105. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py +0 -0
  106. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py +0 -0
  107. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py +0 -0
  108. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py +0 -0
  109. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py +0 -0
  110. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/__init__.py +0 -0
  111. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py +0 -0
  112. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi +0 -0
  113. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/__init__.py +0 -0
  114. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py +0 -0
  115. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi +0 -0
  116. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -0
  117. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py +0 -0
  118. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi +0 -0
  119. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -0
  120. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py +0 -0
  121. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi +0 -0
  122. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -0
  123. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py +0 -0
  124. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi +0 -0
  125. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -0
  126. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py +0 -0
  127. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi +0 -0
  128. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -0
  129. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py +0 -0
  130. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi +0 -0
  131. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py +0 -0
  132. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi +0 -0
  133. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -0
  134. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py +0 -0
  135. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi +0 -0
  136. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -0
  137. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py +0 -0
  138. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi +0 -0
  139. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py +0 -0
  140. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi +0 -0
  141. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -0
  142. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py +0 -0
  143. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi +0 -0
  144. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -0
  145. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py +0 -0
  146. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py +0 -0
  147. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi +0 -0
  148. {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -0
  149. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/__init__.py +0 -0
  150. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/__main__.py +0 -0
  151. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/address_normalizer.py +0 -0
  152. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/aesgcm.py +0 -0
  153. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/assertion_config.py +0 -0
  154. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_crypto.py +0 -0
  155. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_decryption.py +0 -0
  156. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_encryption.py +0 -0
  157. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/auth_headers.py +0 -0
  158. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/autoconfigure_utils.py +0 -0
  159. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/collection_store.py +0 -0
  160. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/collection_store_impl.py +0 -0
  161. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/config.py +0 -0
  162. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/connect_client.py +0 -0
  163. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/constants.py +0 -0
  164. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/crypto_utils.py +0 -0
  165. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/dpop.py +0 -0
  166. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/ecc_mode.py +0 -0
  167. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/eckeypair.py +0 -0
  168. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/header.py +0 -0
  169. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/invalid_zip_exception.py +0 -0
  170. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_client.py +0 -0
  171. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_connect_rpc_client.py +0 -0
  172. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_info.py +0 -0
  173. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_key_cache.py +0 -0
  174. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/key_type.py +0 -0
  175. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/key_type_constants.py +0 -0
  176. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/manifest.py +0 -0
  177. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf.py +0 -0
  178. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf_ecdsa_struct.py +0 -0
  179. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf_type.py +0 -0
  180. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_binding_serializer.py +0 -0
  181. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_info.py +0 -0
  182. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_object.py +0 -0
  183. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_stub.py +0 -0
  184. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/resource_locator.py +0 -0
  185. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk_builder.py +0 -0
  186. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk_exceptions.py +0 -0
  187. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/symmetric_and_payload_config.py +0 -0
  188. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf.py +0 -0
  189. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf_reader.py +0 -0
  190. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf_writer.py +0 -0
  191. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/token_source.py +0 -0
  192. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/version.py +0 -0
  193. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/zip_reader.py +0 -0
  194. {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/zip_writer.py +0 -0
  195. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/__init__.py +0 -0
  196. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/config_pydantic.py +0 -0
  197. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/conftest.py +0 -0
  198. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_only/test_otdfctl_generated_fixtures.py +0 -0
  199. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_comparison.py +0 -0
  200. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_decrypt.py +0 -0
  201. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_inspect.py +0 -0
  202. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +0 -0
  203. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/python_only/test_kas_client_integration.py +0 -0
  204. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/support_sdk.py +0 -0
  205. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_cli_integration.py +0 -0
  206. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_cli_tdf_validation.py +0 -0
  207. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/empty_file.txt +0 -0
  208. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_binary.png +0 -0
  209. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_text.txt +0 -0
  210. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_with_attributes.txt +0 -0
  211. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/mock_crypto.py +0 -0
  212. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/server_logs.py +0 -0
  213. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_cli_args.py +0 -0
  214. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_common.py +0 -0
  215. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_otdfctl.py +0 -0
  216. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_otdfctl_args.py +0 -0
  217. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_address_normalizer.py +0 -0
  218. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_aesgcm.py +0 -0
  219. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_assertion_config.py +0 -0
  220. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_asym_encryption.py +0 -0
  221. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_autoconfigure_utils.py +0 -0
  222. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_cli.py +0 -0
  223. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_collection_store.py +0 -0
  224. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_config.py +0 -0
  225. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_crypto_utils.py +0 -0
  226. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_eckeypair.py +0 -0
  227. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_header.py +0 -0
  228. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_inner_classes.py +0 -0
  229. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_client.py +0 -0
  230. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_key_cache.py +0 -0
  231. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_key_management.py +0 -0
  232. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_key_type.py +0 -0
  233. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_log_collection.py +0 -0
  234. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_manifest.py +0 -0
  235. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_manifest_format.py +0 -0
  236. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf.py +0 -0
  237. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_ecdsa_struct.py +0 -0
  238. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_integration.py +0 -0
  239. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_type.py +0 -0
  240. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_policy_object.py +0 -0
  241. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk.py +0 -0
  242. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_builder.py +0 -0
  243. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_exceptions.py +0 -0
  244. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_mock.py +0 -0
  245. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_tdf_integration.py +0 -0
  246. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf.py +0 -0
  247. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_key_management.py +0 -0
  248. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_reader.py +0 -0
  249. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_writer.py +0 -0
  250. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_token_source.py +0 -0
  251. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_url_normalization.py +0 -0
  252. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_use_plaintext_flow.py +0 -0
  253. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_version.py +0 -0
  254. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_zip_reader.py +0 -0
  255. {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_zip_writer.py +0 -0
@@ -1,4 +1,6 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
2
4
 
3
5
  # Derive additional environment variables
4
6
  TOKEN_URL="${OIDC_OP_TOKEN_ENDPOINT}"
@@ -24,6 +26,11 @@ get_token() {
24
26
 
25
27
  echo "🔐 Getting access token..."
26
28
  BEARER=$( get_token | jq -r '.access_token' )
29
+ if [ -z "$BEARER" ]; then
30
+ echo "❌ Failed to get access token."
31
+ exit 1
32
+ fi
33
+
27
34
  # NOTE: It's always okay to print this token, because it will
28
35
  # only be valid / available in dummy / dev scenarios
29
36
  [[ "${DEBUG:-}" == "1" ]] && echo "Got Access Token: ${BEARER}"
@@ -1,9 +1,6 @@
1
1
  # Build otdf-python wheel using uv and output the wheel path for downstream workflows
2
2
  name: "Build Python Wheel"
3
3
  on:
4
- push:
5
- branches:
6
- - chore/rewrite
7
4
  pull_request:
8
5
 
9
6
  jobs:
@@ -154,6 +154,7 @@ jobs:
154
154
  with:
155
155
  enable-cache: true
156
156
  cache-dependency-glob: "uv.lock"
157
+ python-version: ${{ inputs.python_version }}
157
158
 
158
159
  - name: Run all tests, minus integration tests
159
160
  env:
@@ -46,14 +46,14 @@ jobs:
46
46
  target-branch: main
47
47
  token: ${{ secrets.GITHUB_TOKEN }}
48
48
 
49
- # Trigger appropriate publish workflows based on release type
50
- trigger-publish:
49
+ # Publish packages only when releases are actually created by release-please
50
+ publish:
51
51
  permissions:
52
52
  contents: write
53
53
  # This permission is mandatory for PyPI's trusted publishing
54
54
  id-token: write
55
55
  needs: release-please
56
- if: ${{ needs.release-please.outputs.releases_created }}
56
+ if: ${{ needs.release-please.outputs.releases_created == 'true' }}
57
57
  runs-on: ubuntu-latest
58
58
  steps:
59
59
  - uses: actions/checkout@v4
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.3"
3
+ }
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ ## [0.3.3](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.3.2...otdf-python-v0.3.3) (2025-09-17)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * improve docs ([#106](https://github.com/b-long/opentdf-python-sdk/issues/106)) ([49aa4ae](https://github.com/b-long/opentdf-python-sdk/commit/49aa4aea5e576c20b3e26c852331de8b0469742f))
9
+
10
+ ## [0.3.2](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.3.1...otdf-python-v0.3.2) (2025-09-12)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * fix release-please configuration ([#104](https://github.com/b-long/opentdf-python-sdk/issues/104)) ([3b1c949](https://github.com/b-long/opentdf-python-sdk/commit/3b1c949680b1c4e8ec5bae5d2dbb2f18dc53b559))
16
+
17
+ ## [0.3.1](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.3.0...otdf-python-v0.3.1) (2025-09-12)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * testing improvements ([#102](https://github.com/b-long/opentdf-python-sdk/issues/102)) ([8e82361](https://github.com/b-long/opentdf-python-sdk/commit/8e8236190df157da8ab7fda0b6dfb9cd78bae3bf))
23
+
24
+ ## [0.3.0](https://github.com/b-long/opentdf-python-sdk/compare/v0.2.20...otdf-python-v0.3.0) (2025-09-11)
25
+
26
+
27
+ ### ⚠ BREAKING CHANGES
28
+
29
+ * rewrite in pure Python ([#62](https://github.com/b-long/opentdf-python-sdk/issues/62))
30
+
31
+ ### Features
32
+
33
+ * configure release-please ([#74](https://github.com/b-long/opentdf-python-sdk/issues/74)) ([439becd](https://github.com/b-long/opentdf-python-sdk/commit/439becd82a5faf834a190516b64e21aa331c0176))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: otdf-python
3
- Version: 0.3.1
3
+ Version: 0.3.3
4
4
  Summary: Unofficial OpenTDF SDK for Python
5
5
  Author-email: b-long <b-long@users.noreply.github.com>
6
6
  License-File: LICENSE
@@ -32,65 +32,6 @@ Unofficial OpenTDF SDK for Python
32
32
 
33
33
  A legacy version (0.2.x) of this project is available for users who need the previous implementation. For more information, see [LEGACY_VERSION.md](docs/LEGACY_VERSION.md) or visit the [legacy branch on GitHub](https://github.com/b-long/opentdf-python-sdk/tree/0.2.x).
34
34
 
35
- ## Prerequisites
36
-
37
- This project uses [uv](https://docs.astral.sh/uv/) for dependency management and task running.
38
-
39
- ### Installing uv
40
-
41
- Install `uv` using one of the following methods:
42
-
43
- **macOS/Linux:**
44
- ```bash
45
- curl -LsSf https://astral.sh/uv/install.sh | sh
46
- ```
47
-
48
- **Windows:**
49
- ```powershell
50
- powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
51
- ```
52
-
53
- **Using Homebrew (macOS):**
54
- ```bash
55
- brew install uv
56
- ```
57
-
58
- For more installation options, see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/).
59
-
60
- ## Development Setup
61
-
62
- 1. Clone the repository:
63
- ```bash
64
- git clone <repository-url>
65
- cd opentdf-python-sdk
66
- ```
67
-
68
- 2. Install dependencies:
69
- ```bash
70
- uv sync
71
- ```
72
-
73
- ## Running Tests
74
-
75
- Run the full test suite:
76
- ```bash
77
- uv run pytest tests/
78
- ```
79
-
80
- Run specific test files:
81
- ```bash
82
- uv run pytest tests/test_sdk.py
83
- ```
84
-
85
- Run tests with verbose output:
86
- ```bash
87
- uv run pytest tests/ -v
88
- ```
89
-
90
- Run integration tests only:
91
- ```bash
92
- uv run pytest tests/ -m integration
93
- ```
94
35
 
95
36
  ## Installation
96
37
 
@@ -99,21 +40,6 @@ Install from PyPI:
99
40
  pip install otdf-python
100
41
  ```
101
42
 
102
-
103
- ## Protobuf & Connect RPC Generation
104
-
105
- This project uses a dedicated submodule, `otdf-python-proto/`, for generating Python protobuf files and Connect RPC clients from OpenTDF platform proto definitions.
106
-
107
- ### Regenerating Protobuf & Connect RPC Files
108
-
109
- From the submodule:
110
- ```bash
111
- cd otdf-python-proto
112
- uv run python scripts/generate_connect_proto.py
113
- ```
114
-
115
- See [`otdf-python-proto/README.md`](otdf-python-proto/README.md) and [`PROTOBUF_SETUP.md`](PROTOBUF_SETUP.md) for details.
116
-
117
43
  ## Quick Start
118
44
 
119
45
  ### Basic Configuration
@@ -160,7 +86,7 @@ sdk = builder.build()
160
86
  from io import BytesIO
161
87
 
162
88
  # Create TDF configuration with attributes
163
- config = sdk.new_tdf_config(attributes=["https://example.com/attr/classification/value/public"])
89
+ config = sdk.new_tdf_config(attributes=["https://example.net/attr/attr1/value/value1"])
164
90
 
165
91
  # Encrypt data to TDF format
166
92
  input_data = b"Hello, World!"
@@ -176,15 +102,12 @@ with open("encrypted.tdf", "wb") as f:
176
102
  ### Decrypt Data
177
103
 
178
104
  ```python
179
- from otdf_python.tdf import TDFReaderConfig
180
-
181
105
  # Read encrypted TDF file
182
106
  with open("encrypted.tdf", "rb") as f:
183
107
  encrypted_data = f.read()
184
108
 
185
109
  # Decrypt TDF
186
- reader_config = TDFReaderConfig()
187
- tdf_reader = sdk.load_tdf(encrypted_data, reader_config)
110
+ tdf_reader = sdk.load_tdf(encrypted_data)
188
111
  decrypted_data = tdf_reader.payload
189
112
 
190
113
  # Save decrypted data
@@ -208,6 +131,7 @@ src/otdf_python/
208
131
  └── ... # Additional modules
209
132
  tests/
210
133
  └── ... # Various tests
134
+ ```
211
135
 
212
136
  ## Contributing
213
137
 
@@ -215,14 +139,14 @@ tests/
215
139
  2. Create a feature branch: `git checkout -b feature-name`
216
140
  3. Make your changes
217
141
  4. Run tests: `uv run pytest tests/`
218
- 5. Commit your changes: `git commit -am 'Add feature'`
142
+ 5. Commit your changes: `git commit -am 'feat: add feature'`
219
143
  6. Push to the branch: `git push origin feature-name`
220
144
  7. Submit a pull request
221
145
 
222
146
  ### Release Process
223
147
 
224
148
  For maintainers and contributors working on releases:
225
- - See [RELEASES.md](RELEASES.md) for comprehensive release documentation
149
+ - See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation
226
150
  - Feature branch alpha releases available for testing changes before merge
227
151
  - Automated releases via Release Please on the main branch
228
152
 
@@ -13,65 +13,6 @@ Unofficial OpenTDF SDK for Python
13
13
 
14
14
  A legacy version (0.2.x) of this project is available for users who need the previous implementation. For more information, see [LEGACY_VERSION.md](docs/LEGACY_VERSION.md) or visit the [legacy branch on GitHub](https://github.com/b-long/opentdf-python-sdk/tree/0.2.x).
15
15
 
16
- ## Prerequisites
17
-
18
- This project uses [uv](https://docs.astral.sh/uv/) for dependency management and task running.
19
-
20
- ### Installing uv
21
-
22
- Install `uv` using one of the following methods:
23
-
24
- **macOS/Linux:**
25
- ```bash
26
- curl -LsSf https://astral.sh/uv/install.sh | sh
27
- ```
28
-
29
- **Windows:**
30
- ```powershell
31
- powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
32
- ```
33
-
34
- **Using Homebrew (macOS):**
35
- ```bash
36
- brew install uv
37
- ```
38
-
39
- For more installation options, see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/).
40
-
41
- ## Development Setup
42
-
43
- 1. Clone the repository:
44
- ```bash
45
- git clone <repository-url>
46
- cd opentdf-python-sdk
47
- ```
48
-
49
- 2. Install dependencies:
50
- ```bash
51
- uv sync
52
- ```
53
-
54
- ## Running Tests
55
-
56
- Run the full test suite:
57
- ```bash
58
- uv run pytest tests/
59
- ```
60
-
61
- Run specific test files:
62
- ```bash
63
- uv run pytest tests/test_sdk.py
64
- ```
65
-
66
- Run tests with verbose output:
67
- ```bash
68
- uv run pytest tests/ -v
69
- ```
70
-
71
- Run integration tests only:
72
- ```bash
73
- uv run pytest tests/ -m integration
74
- ```
75
16
 
76
17
  ## Installation
77
18
 
@@ -80,21 +21,6 @@ Install from PyPI:
80
21
  pip install otdf-python
81
22
  ```
82
23
 
83
-
84
- ## Protobuf & Connect RPC Generation
85
-
86
- This project uses a dedicated submodule, `otdf-python-proto/`, for generating Python protobuf files and Connect RPC clients from OpenTDF platform proto definitions.
87
-
88
- ### Regenerating Protobuf & Connect RPC Files
89
-
90
- From the submodule:
91
- ```bash
92
- cd otdf-python-proto
93
- uv run python scripts/generate_connect_proto.py
94
- ```
95
-
96
- See [`otdf-python-proto/README.md`](otdf-python-proto/README.md) and [`PROTOBUF_SETUP.md`](PROTOBUF_SETUP.md) for details.
97
-
98
24
  ## Quick Start
99
25
 
100
26
  ### Basic Configuration
@@ -141,7 +67,7 @@ sdk = builder.build()
141
67
  from io import BytesIO
142
68
 
143
69
  # Create TDF configuration with attributes
144
- config = sdk.new_tdf_config(attributes=["https://example.com/attr/classification/value/public"])
70
+ config = sdk.new_tdf_config(attributes=["https://example.net/attr/attr1/value/value1"])
145
71
 
146
72
  # Encrypt data to TDF format
147
73
  input_data = b"Hello, World!"
@@ -157,15 +83,12 @@ with open("encrypted.tdf", "wb") as f:
157
83
  ### Decrypt Data
158
84
 
159
85
  ```python
160
- from otdf_python.tdf import TDFReaderConfig
161
-
162
86
  # Read encrypted TDF file
163
87
  with open("encrypted.tdf", "rb") as f:
164
88
  encrypted_data = f.read()
165
89
 
166
90
  # Decrypt TDF
167
- reader_config = TDFReaderConfig()
168
- tdf_reader = sdk.load_tdf(encrypted_data, reader_config)
91
+ tdf_reader = sdk.load_tdf(encrypted_data)
169
92
  decrypted_data = tdf_reader.payload
170
93
 
171
94
  # Save decrypted data
@@ -189,6 +112,7 @@ src/otdf_python/
189
112
  └── ... # Additional modules
190
113
  tests/
191
114
  └── ... # Various tests
115
+ ```
192
116
 
193
117
  ## Contributing
194
118
 
@@ -196,14 +120,14 @@ tests/
196
120
  2. Create a feature branch: `git checkout -b feature-name`
197
121
  3. Make your changes
198
122
  4. Run tests: `uv run pytest tests/`
199
- 5. Commit your changes: `git commit -am 'Add feature'`
123
+ 5. Commit your changes: `git commit -am 'feat: add feature'`
200
124
  6. Push to the branch: `git push origin feature-name`
201
125
  7. Submit a pull request
202
126
 
203
127
  ### Release Process
204
128
 
205
129
  For maintainers and contributors working on releases:
206
- - See [RELEASES.md](RELEASES.md) for comprehensive release documentation
130
+ - See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation
207
131
  - Feature branch alpha releases available for testing changes before merge
208
132
  - Automated releases via Release Please on the main branch
209
133
 
@@ -0,0 +1,156 @@
1
+ # Connect RPC in OpenTDF Python SDK
2
+
3
+ This document describes the Connect RPC implementation in the OpenTDF Python SDK, which provides a modern HTTP-friendly alternative to traditional gRPC.
4
+
5
+ ## Overview
6
+
7
+ Connect RPC is a protocol that brings the benefits of RPC to HTTP APIs. It's designed to be:
8
+ - **HTTP-compatible**: Works with standard HTTP infrastructure
9
+ - **Type-safe**: Generated from Protocol Buffer definitions
10
+ - **Efficient**: Binary protocol with JSON fallback
11
+ - **Simple**: Easy to debug and integrate
12
+
13
+ ## Architecture
14
+
15
+ The SDK uses a two-module structure for protocol buffer generation:
16
+
17
+ - **Main SDK**: `src/otdf_python/` - Core SDK functionality
18
+ - **Protocol Generation**: `otdf-python-proto/` - Generated Connect RPC and protobuf files
19
+
20
+ ### Generated Files
21
+
22
+ Connect RPC generates the following files in `otdf-python-proto/src/otdf_python_proto/`:
23
+
24
+ - `*_connect.py` - Connect RPC client implementations (recommended)
25
+ - `*_pb2.py` - Protocol buffer message definitions
26
+ - `legacy_grpc/*_pb2_grpc.py` - Traditional gRPC clients (backward compatibility)
27
+
28
+ ## Usage
29
+
30
+ ### Client Creation
31
+
32
+ Connect RPC clients are created using the generated `*_connect.py` modules:
33
+
34
+ ```python
35
+ from otdf_python_proto.kas import kas_connect
36
+ from otdf_python_proto.policy import policy_connect
37
+
38
+ # Create Connect RPC clients
39
+ kas_client = kas_connect.KeyAccessServiceClient(base_url="https://example.com")
40
+ policy_client = policy_connect.PolicyServiceClient(base_url="https://your-policy-endpoint")
41
+ ```
42
+
43
+ ### Authentication
44
+
45
+ Connect RPC clients support standard HTTP authentication:
46
+
47
+ ```python
48
+ import httpx
49
+
50
+ # Create authenticated HTTP client, assuming `token` holds your auth token
51
+ http_client = httpx.Client(
52
+ headers={"Authorization": f"Bearer {token}"}
53
+ )
54
+
55
+ # Use with Connect RPC client
56
+ kas_client = kas_connect.KeyAccessServiceClient(
57
+ base_url="https://example.com",
58
+ http_client=http_client
59
+ )
60
+ ```
61
+
62
+ ## Regenerating Connect RPC Files
63
+
64
+ To regenerate the Connect RPC and protobuf files:
65
+
66
+ ```bash
67
+ cd otdf-python-proto
68
+ uv run python scripts/generate_connect_proto.py
69
+ ```
70
+
71
+ ### Download Fresh Proto Files
72
+
73
+ To download the latest protocol definitions:
74
+
75
+ ```bash
76
+ cd otdf-python-proto
77
+ uv run python scripts/generate_connect_proto.py --download
78
+ ```
79
+
80
+ ### Requirements
81
+
82
+ - `buf` tool: `brew install bufbuild/buf/buf` (or see [official installation guide](https://buf.build/docs/installation))
83
+ - Python dependencies managed by `uv`
84
+
85
+ ## Benefits Over gRPC
86
+
87
+ 1. **HTTP Compatibility**: Works with load balancers, proxies, and other HTTP infrastructure
88
+ 2. **Debugging**: Easy to inspect with standard HTTP tools
89
+ 3. **Flexibility**: Supports both binary and JSON encoding
90
+ 4. **Simplicity**: No special HTTP/2 requirements
91
+
92
+ ## Migration from gRPC
93
+
94
+ If migrating from legacy gRPC clients:
95
+
96
+ 1. Replace `*_pb2_grpc.py` imports with `*_connect.py`
97
+ 2. Update client instantiation to use base URLs instead of channels
98
+ 3. Leverage HTTP client features for authentication and configuration
99
+
100
+ ## Testing
101
+
102
+ Connect RPC clients can be easily mocked and tested using standard HTTP testing tools:
103
+
104
+ ```python
105
+ import httpx
106
+ import respx
107
+ from otdf_python_proto.kas import kas_pb2, kas_connect
108
+
109
+ @respx.mock
110
+ def test_connect_rpc_client():
111
+ # 1. Create a sample protobuf response message
112
+ expected_response = kas_pb2.RewrapResponse(
113
+ entity_wrapped_key=b'some-unwrapped-key'
114
+ )
115
+
116
+ # 2. Mock the correct Connect RPC endpoint URL
117
+ respx.post("https://example.com/kas.AccessService/Rewrap").mock(
118
+ return_value=httpx.Response(
119
+ 200,
120
+ # 3. Return the serialized protobuf message as content
121
+ content=expected_response.SerializeToString(),
122
+ headers={'Content-Type': 'application/proto'}
123
+ )
124
+ )
125
+
126
+ client = kas_connect.KeyAccessServiceClient(base_url="https://example.com")
127
+ # Test client calls...
128
+ ```
129
+
130
+ ## Error Handling
131
+
132
+ Connect RPC provides structured error handling through standard HTTP status codes and error details:
133
+
134
+ ```python
135
+ from connectrpc import ConnectError
136
+
137
+ try:
138
+ # Assuming `kas_client` and `request` are defined as in previous examples
139
+ response = kas_client.rewrap(request)
140
+ except ConnectError as e:
141
+ print(f"Connect RPC error: {e.code} - {e.message}")
142
+ # Handle specific error types
143
+ ```
144
+
145
+ ## Performance Considerations
146
+
147
+ - Use connection pooling with `httpx.Client` for better performance
148
+ - Configure appropriate timeouts for your use case
149
+ - Consider using binary encoding for high-throughput scenarios
150
+
151
+ ## Additional Resources
152
+
153
+ For more information, see:
154
+ - [Connect RPC Documentation](https://connectrpc.com/docs/)
155
+ - [Connect Python Repository](https://github.com/connectrpc/connect-python)
156
+ - [OpenTDF Platform](https://github.com/opentdf/platform)
@@ -0,0 +1,95 @@
1
+ # Developing the OpenTDF Python SDK
2
+
3
+ ## Enabling Direct Access Grants
4
+
5
+ In order to use token exchange with direct access grants, you will need to enable the `Direct Access Grants` option in your IdP (e.g. Keycloak)
6
+ client settings.
7
+
8
+ ## Setting Up Your Development Environment
9
+
10
+ A convenience script is provided to help set up your development environment with an OpenTDF platform running in docker.
11
+
12
+ You can run the following command in your terminal:
13
+
14
+ ```bash
15
+ .github/start_opentdf_docker.sh
16
+ ```
17
+
18
+ Using this script will automatically enable direct access grants in Keycloak for you.
19
+
20
+ ## Dependency Management
21
+
22
+ ### Prerequisites
23
+
24
+ This project uses [uv](https://docs.astral.sh/uv/) for dependency management and task running.
25
+
26
+ #### Installing uv
27
+
28
+ Install `uv` using one of the following methods:
29
+
30
+ **macOS/Linux:**
31
+ ```bash
32
+ curl -LsSf https://astral.sh/uv/install.sh | sh
33
+ ```
34
+
35
+ **Windows:**
36
+ ```powershell
37
+ powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
38
+ ```
39
+
40
+ **Using Homebrew (macOS):**
41
+ ```bash
42
+ brew install uv
43
+ ```
44
+
45
+ For more installation options, see the [uv installation guide](https://docs.astral.sh/uv/getting-started/installation/).
46
+
47
+ ## Development Setup
48
+
49
+ 1. Clone the repository:
50
+ ```bash
51
+ git clone https://github.com/b-long/opentdf-python-sdk.git
52
+ cd opentdf-python-sdk
53
+ ```
54
+
55
+ 2. Install dependencies:
56
+ ```bash
57
+ uv sync
58
+ ```
59
+
60
+ ### Running Tests
61
+
62
+ Run the full test suite:
63
+ ```bash
64
+ uv run pytest tests/
65
+ ```
66
+
67
+ Run specific test files:
68
+ ```bash
69
+ uv run pytest tests/test_sdk.py
70
+ ```
71
+
72
+ Run tests with verbose output:
73
+ ```bash
74
+ uv run pytest tests/ -v
75
+ ```
76
+
77
+ Run integration tests only:
78
+ ```bash
79
+ uv run pytest tests/ -m integration
80
+ ```
81
+
82
+
83
+ ### Protobuf & Connect RPC Generation
84
+
85
+ This project uses a dedicated submodule, `otdf-python-proto/`, for generating Python protobuf files and Connect RPC clients from OpenTDF platform proto definitions.
86
+
87
+ #### Regenerating Protobuf & Connect RPC Files
88
+
89
+ From the submodule:
90
+ ```bash
91
+ cd otdf-python-proto
92
+ uv run python scripts/generate_connect_proto.py
93
+ ```
94
+
95
+ See [`otdf-python-proto/README.md`](../otdf-python-proto/README.md) and [`PROTOBUF_SETUP.md`](./PROTOBUF_SETUP.md) for details.
@@ -12,7 +12,7 @@ This project now supports **Connect RPC**, a modern HTTP-friendly alternative to
12
12
  - 🚀 **Simplified deployment** - No special gRPC infrastructure required
13
13
  - 📊 **Better observability** - Standard HTTP status codes and headers
14
14
 
15
- See [CONNECT_RPC_MIGRATION.md](../CONNECT_RPC_MIGRATION.md) for migration guide and examples.
15
+ See [CONNECT_RPC.md](../docs/CONNECT_RPC.md) for additional information.
16
16
 
17
17
  ## Structure
18
18
 
@@ -158,7 +158,7 @@ response = client.GetPolicy(request)
158
158
 
159
159
  If you're migrating from traditional gRPC clients to Connect RPC:
160
160
 
161
- 1. Read the [Connect RPC Migration Guide](../CONNECT_RPC_MIGRATION.md)
161
+ 1. Read the [Connect RPC Migration Guide](../docs/CONNECT_RPC.md)
162
162
  2. Run the Connect RPC generation: `./scripts/build_connect_proto.sh` (or from the submodule: `cd otdf-python-proto && uv run python scripts/generate_connect_proto.py`)
163
163
  3. Update your client code to use `*_connect.py` modules
164
164
  4. Test with your authentication and deployment setup
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "otdf-python-proto"
3
- version = "0.3.1"
3
+ version = "0.3.3"
4
4
  description = "Generated protobuf files for OpenTDF Python SDK"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -87,7 +87,7 @@ if [[ $? -eq 0 ]]; then
87
87
  echo " python examples/connect_rpc_client_example.py"
88
88
  echo ""
89
89
  echo "For more information, see:"
90
- echo " - CONNECT_RPC_MIGRATION.md"
90
+ echo " - docs/CONNECT_RPC.md"
91
91
  echo " - https://connectrpc.com/docs/"
92
92
  else
93
93
  echo "✗ Connect RPC generation failed!"
@@ -481,7 +481,7 @@ wheels = [
481
481
 
482
482
  [[package]]
483
483
  name = "otdf-python-proto"
484
- version = "0.3.1"
484
+ version = "0.3.3"
485
485
  source = { editable = "." }
486
486
  dependencies = [
487
487
  { name = "connect-python", extra = ["compiler"] },
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "otdf-python"
3
- version = "0.3.1"
3
+ version = "0.3.3"
4
4
  description = "Unofficial OpenTDF SDK for Python"
5
5
  readme = "README.md"
6
6
  authors = [