otdf-python 0.3.1__tar.gz → 0.3.2__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 (254) hide show
  1. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/check_entitlements.sh +8 -1
  2. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/workflows/platform-integration-test.yaml +1 -0
  3. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/workflows/release-please.yaml +3 -3
  4. otdf_python-0.3.2/.release-please-manifest.json +3 -0
  5. otdf_python-0.3.2/CHANGELOG.md +26 -0
  6. {otdf_python-0.3.1 → otdf_python-0.3.2}/PKG-INFO +6 -80
  7. {otdf_python-0.3.1 → otdf_python-0.3.2}/README.md +5 -79
  8. otdf_python-0.3.2/docs/DEVELOPING.md +95 -0
  9. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/pyproject.toml +1 -1
  10. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/uv.lock +1 -1
  11. {otdf_python-0.3.1 → otdf_python-0.3.2}/pyproject.toml +1 -1
  12. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/cli.py +3 -11
  13. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/sdk.py +8 -22
  14. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_pe_interaction.py +1 -1
  15. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_validate_otdf_python.py +1 -7
  16. {otdf_python-0.3.1 → otdf_python-0.3.2}/uv.lock +1 -1
  17. otdf_python-0.3.1/.release-please-manifest.json +0 -3
  18. otdf_python-0.3.1/CHANGELOG.md +0 -28
  19. otdf_python-0.3.1/docs/DEVELOPING.md +0 -18
  20. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/start_opentdf_docker.sh +0 -0
  21. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/workflows/build-python.yaml +0 -0
  22. {otdf_python-0.3.1 → otdf_python-0.3.2}/.github/workflows/test-suite.yaml +0 -0
  23. {otdf_python-0.3.1 → otdf_python-0.3.2}/.gitignore +0 -0
  24. {otdf_python-0.3.1 → otdf_python-0.3.2}/.pre-commit-config.yaml +0 -0
  25. {otdf_python-0.3.1 → otdf_python-0.3.2}/.release-please-config-develop.json +0 -0
  26. {otdf_python-0.3.1 → otdf_python-0.3.2}/.release-please-config.json +0 -0
  27. {otdf_python-0.3.1 → otdf_python-0.3.2}/.release-please-manifest-develop.json +0 -0
  28. {otdf_python-0.3.1 → otdf_python-0.3.2}/.vscode/extensions.json +0 -0
  29. {otdf_python-0.3.1 → otdf_python-0.3.2}/.vscode/settings.json +0 -0
  30. {otdf_python-0.3.1 → otdf_python-0.3.2}/LICENSE +0 -0
  31. {otdf_python-0.3.1 → otdf_python-0.3.2}/conftest.py +0 -0
  32. {otdf_python-0.3.1 → otdf_python-0.3.2}/docs/CONNECT_RPC_MIGRATION.md +0 -0
  33. {otdf_python-0.3.1 → otdf_python-0.3.2}/docs/LEGACY_VERSION.md +0 -0
  34. {otdf_python-0.3.1 → otdf_python-0.3.2}/docs/PROTOBUF_SETUP.md +0 -0
  35. {otdf_python-0.3.1 → otdf_python-0.3.2}/docs/RELEASES.md +0 -0
  36. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/README.md +0 -0
  37. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/buf.gen.yaml +0 -0
  38. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/buf.lock +0 -0
  39. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/buf.yaml +0 -0
  40. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/authorization/authorization.proto +0 -0
  41. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/authorization/v2/authorization.proto +0 -0
  42. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/common/common.proto +0 -0
  43. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entity/entity.proto +0 -0
  44. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto +0 -0
  45. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto +0 -0
  46. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/kas/kas.proto +0 -0
  47. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/logger/audit/test.proto +0 -0
  48. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/actions/actions.proto +0 -0
  49. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/attributes/attributes.proto +0 -0
  50. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto +0 -0
  51. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto +0 -0
  52. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto +0 -0
  53. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/objects.proto +0 -0
  54. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto +0 -0
  55. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto +0 -0
  56. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/selectors.proto +0 -0
  57. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto +0 -0
  58. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto +0 -0
  59. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto +0 -0
  60. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/scripts/build_connect_proto.sh +0 -0
  61. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/scripts/generate_connect_proto.py +0 -0
  62. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/scripts/setup_connect_rpc.py +0 -0
  63. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/__init__.py +0 -0
  64. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py +0 -0
  65. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py +0 -0
  66. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi +0 -0
  67. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2_connect.py +0 -0
  68. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py +0 -0
  69. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi +0 -0
  70. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -0
  71. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/__init__.py +0 -0
  72. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py +0 -0
  73. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi +0 -0
  74. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/__init__.py +0 -0
  75. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py +0 -0
  76. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi +0 -0
  77. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py +0 -0
  78. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py +0 -0
  79. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi +0 -0
  80. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -0
  81. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py +0 -0
  82. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi +0 -0
  83. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -0
  84. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/__init__.py +0 -0
  85. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py +0 -0
  86. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi +0 -0
  87. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2_connect.py +0 -0
  88. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py +0 -0
  89. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py +0 -0
  90. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py +0 -0
  91. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py +0 -0
  92. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py +0 -0
  93. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py +0 -0
  94. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py +0 -0
  95. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py +0 -0
  96. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py +0 -0
  97. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py +0 -0
  98. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py +0 -0
  99. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py +0 -0
  100. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py +0 -0
  101. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py +0 -0
  102. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py +0 -0
  103. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py +0 -0
  104. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py +0 -0
  105. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py +0 -0
  106. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py +0 -0
  107. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py +0 -0
  108. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py +0 -0
  109. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/__init__.py +0 -0
  110. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py +0 -0
  111. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi +0 -0
  112. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/__init__.py +0 -0
  113. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py +0 -0
  114. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi +0 -0
  115. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -0
  116. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py +0 -0
  117. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi +0 -0
  118. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -0
  119. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py +0 -0
  120. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi +0 -0
  121. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -0
  122. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py +0 -0
  123. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi +0 -0
  124. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -0
  125. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py +0 -0
  126. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi +0 -0
  127. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -0
  128. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py +0 -0
  129. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi +0 -0
  130. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py +0 -0
  131. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi +0 -0
  132. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -0
  133. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py +0 -0
  134. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi +0 -0
  135. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -0
  136. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py +0 -0
  137. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi +0 -0
  138. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py +0 -0
  139. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi +0 -0
  140. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -0
  141. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py +0 -0
  142. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi +0 -0
  143. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -0
  144. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py +0 -0
  145. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py +0 -0
  146. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi +0 -0
  147. {otdf_python-0.3.1 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -0
  148. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/__init__.py +0 -0
  149. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/__main__.py +0 -0
  150. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/address_normalizer.py +0 -0
  151. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/aesgcm.py +0 -0
  152. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/assertion_config.py +0 -0
  153. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/asym_crypto.py +0 -0
  154. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/asym_decryption.py +0 -0
  155. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/asym_encryption.py +0 -0
  156. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/auth_headers.py +0 -0
  157. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/autoconfigure_utils.py +0 -0
  158. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/collection_store.py +0 -0
  159. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/collection_store_impl.py +0 -0
  160. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/config.py +0 -0
  161. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/connect_client.py +0 -0
  162. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/constants.py +0 -0
  163. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/crypto_utils.py +0 -0
  164. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/dpop.py +0 -0
  165. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/ecc_mode.py +0 -0
  166. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/eckeypair.py +0 -0
  167. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/header.py +0 -0
  168. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/invalid_zip_exception.py +0 -0
  169. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/kas_client.py +0 -0
  170. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/kas_connect_rpc_client.py +0 -0
  171. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/kas_info.py +0 -0
  172. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/kas_key_cache.py +0 -0
  173. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/key_type.py +0 -0
  174. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/key_type_constants.py +0 -0
  175. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/manifest.py +0 -0
  176. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/nanotdf.py +0 -0
  177. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/nanotdf_ecdsa_struct.py +0 -0
  178. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/nanotdf_type.py +0 -0
  179. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/policy_binding_serializer.py +0 -0
  180. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/policy_info.py +0 -0
  181. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/policy_object.py +0 -0
  182. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/policy_stub.py +0 -0
  183. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/resource_locator.py +0 -0
  184. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/sdk_builder.py +0 -0
  185. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/sdk_exceptions.py +0 -0
  186. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/symmetric_and_payload_config.py +0 -0
  187. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/tdf.py +0 -0
  188. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/tdf_reader.py +0 -0
  189. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/tdf_writer.py +0 -0
  190. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/token_source.py +0 -0
  191. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/version.py +0 -0
  192. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/zip_reader.py +0 -0
  193. {otdf_python-0.3.1 → otdf_python-0.3.2}/src/otdf_python/zip_writer.py +0 -0
  194. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/__init__.py +0 -0
  195. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/config_pydantic.py +0 -0
  196. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/conftest.py +0 -0
  197. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/otdfctl_only/test_otdfctl_generated_fixtures.py +0 -0
  198. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_comparison.py +0 -0
  199. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_decrypt.py +0 -0
  200. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_inspect.py +0 -0
  201. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +0 -0
  202. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/python_only/test_kas_client_integration.py +0 -0
  203. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/support_sdk.py +0 -0
  204. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_cli_integration.py +0 -0
  205. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_cli_tdf_validation.py +0 -0
  206. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_data/empty_file.txt +0 -0
  207. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_data/sample_binary.png +0 -0
  208. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_data/sample_text.txt +0 -0
  209. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/integration/test_data/sample_with_attributes.txt +0 -0
  210. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/mock_crypto.py +0 -0
  211. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/server_logs.py +0 -0
  212. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/support_cli_args.py +0 -0
  213. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/support_common.py +0 -0
  214. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/support_otdfctl.py +0 -0
  215. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/support_otdfctl_args.py +0 -0
  216. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_address_normalizer.py +0 -0
  217. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_aesgcm.py +0 -0
  218. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_assertion_config.py +0 -0
  219. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_asym_encryption.py +0 -0
  220. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_autoconfigure_utils.py +0 -0
  221. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_cli.py +0 -0
  222. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_collection_store.py +0 -0
  223. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_config.py +0 -0
  224. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_crypto_utils.py +0 -0
  225. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_eckeypair.py +0 -0
  226. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_header.py +0 -0
  227. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_inner_classes.py +0 -0
  228. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_kas_client.py +0 -0
  229. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_kas_key_cache.py +0 -0
  230. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_kas_key_management.py +0 -0
  231. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_key_type.py +0 -0
  232. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_log_collection.py +0 -0
  233. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_manifest.py +0 -0
  234. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_manifest_format.py +0 -0
  235. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_nanotdf.py +0 -0
  236. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_nanotdf_ecdsa_struct.py +0 -0
  237. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_nanotdf_integration.py +0 -0
  238. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_nanotdf_type.py +0 -0
  239. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_policy_object.py +0 -0
  240. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_sdk.py +0 -0
  241. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_sdk_builder.py +0 -0
  242. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_sdk_exceptions.py +0 -0
  243. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_sdk_mock.py +0 -0
  244. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_sdk_tdf_integration.py +0 -0
  245. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_tdf.py +0 -0
  246. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_tdf_key_management.py +0 -0
  247. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_tdf_reader.py +0 -0
  248. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_tdf_writer.py +0 -0
  249. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_token_source.py +0 -0
  250. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_url_normalization.py +0 -0
  251. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_use_plaintext_flow.py +0 -0
  252. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_version.py +0 -0
  253. {otdf_python-0.3.1 → otdf_python-0.3.2}/tests/test_zip_reader.py +0 -0
  254. {otdf_python-0.3.1 → otdf_python-0.3.2}/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}"
@@ -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.2"
3
+ }
@@ -0,0 +1,26 @@
1
+ # Changelog
2
+
3
+ ## [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)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * 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))
9
+
10
+ ## [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)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * testing improvements ([#102](https://github.com/b-long/opentdf-python-sdk/issues/102)) ([8e82361](https://github.com/b-long/opentdf-python-sdk/commit/8e8236190df157da8ab7fda0b6dfb9cd78bae3bf))
16
+
17
+ ## [0.3.0](https://github.com/b-long/opentdf-python-sdk/compare/v0.2.20...otdf-python-v0.3.0) (2025-09-11)
18
+
19
+
20
+ ### ⚠ BREAKING CHANGES
21
+
22
+ * rewrite in pure Python ([#62](https://github.com/b-long/opentdf-python-sdk/issues/62))
23
+
24
+ ### Features
25
+
26
+ * 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.2
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!"
@@ -183,8 +109,7 @@ with open("encrypted.tdf", "rb") as f:
183
109
  encrypted_data = f.read()
184
110
 
185
111
  # Decrypt TDF
186
- reader_config = TDFReaderConfig()
187
- tdf_reader = sdk.load_tdf(encrypted_data, reader_config)
112
+ tdf_reader = sdk.load_tdf(encrypted_data)
188
113
  decrypted_data = tdf_reader.payload
189
114
 
190
115
  # Save decrypted data
@@ -208,6 +133,7 @@ src/otdf_python/
208
133
  └── ... # Additional modules
209
134
  tests/
210
135
  └── ... # Various tests
136
+ ```
211
137
 
212
138
  ## Contributing
213
139
 
@@ -215,14 +141,14 @@ tests/
215
141
  2. Create a feature branch: `git checkout -b feature-name`
216
142
  3. Make your changes
217
143
  4. Run tests: `uv run pytest tests/`
218
- 5. Commit your changes: `git commit -am 'Add feature'`
144
+ 5. Commit your changes: `git commit -am 'feat: add feature'`
219
145
  6. Push to the branch: `git push origin feature-name`
220
146
  7. Submit a pull request
221
147
 
222
148
  ### Release Process
223
149
 
224
150
  For maintainers and contributors working on releases:
225
- - See [RELEASES.md](RELEASES.md) for comprehensive release documentation
151
+ - See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation
226
152
  - Feature branch alpha releases available for testing changes before merge
227
153
  - Automated releases via Release Please on the main branch
228
154
 
@@ -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!"
@@ -164,8 +90,7 @@ with open("encrypted.tdf", "rb") as f:
164
90
  encrypted_data = f.read()
165
91
 
166
92
  # Decrypt TDF
167
- reader_config = TDFReaderConfig()
168
- tdf_reader = sdk.load_tdf(encrypted_data, reader_config)
93
+ tdf_reader = sdk.load_tdf(encrypted_data)
169
94
  decrypted_data = tdf_reader.payload
170
95
 
171
96
  # Save decrypted data
@@ -189,6 +114,7 @@ src/otdf_python/
189
114
  └── ... # Additional modules
190
115
  tests/
191
116
  └── ... # Various tests
117
+ ```
192
118
 
193
119
  ## Contributing
194
120
 
@@ -196,14 +122,14 @@ tests/
196
122
  2. Create a feature branch: `git checkout -b feature-name`
197
123
  3. Make your changes
198
124
  4. Run tests: `uv run pytest tests/`
199
- 5. Commit your changes: `git commit -am 'Add feature'`
125
+ 5. Commit your changes: `git commit -am 'feat: add feature'`
200
126
  6. Push to the branch: `git push origin feature-name`
201
127
  7. Submit a pull request
202
128
 
203
129
  ### Release Process
204
130
 
205
131
  For maintainers and contributors working on releases:
206
- - See [RELEASES.md](RELEASES.md) for comprehensive release documentation
132
+ - See [RELEASES.md](docs/RELEASES.md) for comprehensive release documentation
207
133
  - Feature branch alpha releases available for testing changes before merge
208
134
  - Automated releases via Release Please on the main branch
209
135
 
@@ -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.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "otdf-python-proto"
3
- version = "0.3.1"
3
+ version = "0.3.2"
4
4
  description = "Generated protobuf files for OpenTDF Python SDK"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -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.2"
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.2"
4
4
  description = "Unofficial OpenTDF SDK for Python"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -20,7 +20,6 @@ from otdf_python.config import KASInfo, NanoTDFConfig, TDFConfig
20
20
  from otdf_python.sdk import SDK
21
21
  from otdf_python.sdk_builder import SDKBuilder
22
22
  from otdf_python.sdk_exceptions import SDKException
23
- from otdf_python.tdf import TDFReaderConfig
24
23
 
25
24
  try:
26
25
  __version__ = metadata.version("otdf-python")
@@ -310,10 +309,7 @@ def cmd_decrypt(args):
310
309
  if encrypted_data.startswith(b"PK"):
311
310
  # Regular TDF (ZIP format)
312
311
  logger.debug("Decrypting TDF")
313
- reader_config = TDFReaderConfig()
314
- tdf_reader = sdk.load_tdf_with_config(
315
- encrypted_data, reader_config
316
- )
312
+ tdf_reader = sdk.load_tdf(encrypted_data)
317
313
  # Access payload directly from TDFReader
318
314
  payload_bytes = tdf_reader.payload
319
315
  output_file.write(payload_bytes)
@@ -336,8 +332,7 @@ def cmd_decrypt(args):
336
332
  if encrypted_data.startswith(b"PK"):
337
333
  # Regular TDF (ZIP format)
338
334
  logger.debug("Decrypting TDF")
339
- reader_config = TDFReaderConfig()
340
- tdf_reader = sdk.load_tdf_with_config(encrypted_data, reader_config)
335
+ tdf_reader = sdk.load_tdf(encrypted_data)
341
336
  payload_bytes = tdf_reader.payload
342
337
  output_file.write(payload_bytes)
343
338
  logger.info("Successfully decrypted TDF")
@@ -370,10 +365,7 @@ def cmd_inspect(args):
370
365
  if encrypted_data.startswith(b"PK"):
371
366
  # Regular TDF
372
367
  logger.debug("Inspecting TDF")
373
- reader_config = TDFReaderConfig()
374
- tdf_reader = sdk.load_tdf_with_config(
375
- BytesIO(encrypted_data), reader_config
376
- )
368
+ tdf_reader = sdk.load_tdf(BytesIO(encrypted_data))
377
369
  manifest = tdf_reader.manifest
378
370
 
379
371
  # Try to get data attributes
@@ -348,11 +348,13 @@ class SDK(AbstractContextManager):
348
348
  """Returns the platform URL if set"""
349
349
  return self.platform_url
350
350
 
351
- def load_tdf_with_config(
352
- self, tdf_data: bytes | BinaryIO | BytesIO, config: TDFReaderConfig
351
+ def load_tdf(
352
+ self,
353
+ tdf_data: bytes | BinaryIO | BytesIO,
354
+ config: TDFReaderConfig | None = None,
353
355
  ) -> TDFReader:
354
356
  """
355
- Loads a TDF from the provided data according to the config.
357
+ Loads a TDF from the provided data, optionally according to the config.
356
358
 
357
359
  Args:
358
360
  tdf_data: The TDF data as bytes, file object, or BytesIO
@@ -365,26 +367,10 @@ class SDK(AbstractContextManager):
365
367
  SDKException: If there's an error loading the TDF
366
368
  """
367
369
  tdf = TDF(self.services)
368
- return tdf.load_tdf(tdf_data, config)
369
-
370
- def load_tdf_without_config(
371
- self, tdf_data: bytes | BinaryIO | BytesIO
372
- ) -> TDFReader:
373
- """
374
- Loads a TDF from the provided data.
375
-
376
- Args:
377
- tdf_data: The TDF data as bytes, file object, or BytesIO
370
+ if config is None:
371
+ config = TDFReaderConfig()
378
372
 
379
- Returns:
380
- TDFReader: Contains payload and manifest
381
-
382
- Raises:
383
- SDKException: If there's an error loading the TDF
384
- """
385
- tdf = TDF(self.services)
386
- default = TDFReaderConfig()
387
- return tdf.load_tdf(tdf_data, default)
373
+ return tdf.load_tdf(tdf_data, config)
388
374
 
389
375
  def create_tdf(
390
376
  self,
@@ -25,7 +25,7 @@ def decrypt(input_path: Path, output_path: Path, sdk: SDK):
25
25
  with open(input_path, "rb") as infile, open(output_path, "wb") as outfile:
26
26
  try:
27
27
  logger.debug("Decrypting TDF")
28
- tdf_reader = sdk.load_tdf_without_config(infile.read())
28
+ tdf_reader = sdk.load_tdf(infile.read())
29
29
  # Access payload directly from TDFReader
30
30
  payload_bytes = tdf_reader.payload
31
31
  outfile.write(payload_bytes)
@@ -13,7 +13,6 @@ from pathlib import Path
13
13
 
14
14
  import pytest
15
15
 
16
- from otdf_python.tdf import TDFReaderConfig
17
16
  from tests.integration.support_sdk import get_sdk
18
17
 
19
18
  # Set up detailed logging
@@ -52,13 +51,8 @@ def decrypt_file(encrypted_path: Path) -> Path:
52
51
 
53
52
  output_path = encrypted_path.with_suffix(".decrypted")
54
53
  with open(encrypted_path, "rb") as infile, open(output_path, "wb") as outfile:
55
- # Include attributes for policy enforcement
56
- reader_config = TDFReaderConfig(
57
- attributes=_test_attributes # Same attributes used in encrypt_file
58
- )
59
-
60
54
  # Use KAS client for key unwrapping
61
- reader = sdk.load_tdf_with_config(infile.read(), reader_config)
55
+ reader = sdk.load_tdf(infile.read())
62
56
  # TDFReader is a dataclass with payload attribute
63
57
  outfile.write(reader.payload)
64
58
  return output_path
@@ -686,7 +686,7 @@ wheels = [
686
686
 
687
687
  [[package]]
688
688
  name = "otdf-python"
689
- version = "0.3.1"
689
+ version = "0.3.2"
690
690
  source = { editable = "." }
691
691
  dependencies = [
692
692
  { name = "connect-python", extra = ["compiler"] },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.3.0"
3
- }
@@ -1,28 +0,0 @@
1
- # Changelog
2
-
3
- ## [0.3.1](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.3.0...otdf-python-v0.3.1) (2025-09-11)
4
-
5
-
6
- ### Bug Fixes
7
-
8
- * add develop-specific release-please files and update workflow ([63ef99a](https://github.com/b-long/opentdf-python-sdk/commit/63ef99a1439348ab829bec9d993bd6db245d0995))
9
- * address pre-commit (lint) issues ([f61b020](https://github.com/b-long/opentdf-python-sdk/commit/f61b02033f4a132ee1e552be61917d18d5a0bf4c))
10
- * fix .release-please-config.json file ([#97](https://github.com/b-long/opentdf-python-sdk/issues/97)) ([085f056](https://github.com/b-long/opentdf-python-sdk/commit/085f0564a44e4828c4bddfd67f6ecedbe72a6395))
11
- * fix publishing ([de00583](https://github.com/b-long/opentdf-python-sdk/commit/de005832c2a961f732f564b6a0380b6007a59b6b))
12
- * fix publishing ([dbc9f80](https://github.com/b-long/opentdf-python-sdk/commit/dbc9f8002d04ae08dc0403dea61507bd2eb19cd2))
13
- * guarantee target-version decrypt support ([#84](https://github.com/b-long/opentdf-python-sdk/issues/84)) ([238715f](https://github.com/b-long/opentdf-python-sdk/commit/238715f8ef761bcb39c66c13cf017fb891ad6d40))
14
- * omit README from Github releases ([cca9e3e](https://github.com/b-long/opentdf-python-sdk/commit/cca9e3efb9ead3693d401261e3e74debd985653e))
15
- * release configuration ([#99](https://github.com/b-long/opentdf-python-sdk/issues/99)) ([11497fb](https://github.com/b-long/opentdf-python-sdk/commit/11497fbd28e3c92b52e75cf417162ae12843e097))
16
- * release-please configuration ([#95](https://github.com/b-long/opentdf-python-sdk/issues/95)) ([fe1ee2d](https://github.com/b-long/opentdf-python-sdk/commit/fe1ee2d9a8e6763db27582f1d0d4a6625ec3716e))
17
- * remove unnecessary 'ncipollo/release-action' ([6a1d57b](https://github.com/b-long/opentdf-python-sdk/commit/6a1d57b562b6b6f506db9c29fa11858bf28ef702))
18
- * update prerelease config for develop branch ([6cfaee6](https://github.com/b-long/opentdf-python-sdk/commit/6cfaee6fd918f50185859edbab06a2dbf7d7123f))
19
- * use correct 'extra-files' for uv.lock ([0e09171](https://github.com/b-long/opentdf-python-sdk/commit/0e091714cad2a5f462bf0a5444e92d8e71639626))
20
-
21
-
22
- ### Miscellaneous Chores
23
-
24
- * release 0.3.0a10 ([3bb4283](https://github.com/b-long/opentdf-python-sdk/commit/3bb42837fa9547273023859db48c4e4f69325273))
25
- * release 0.3.0a11 ([ce8a520](https://github.com/b-long/opentdf-python-sdk/commit/ce8a52064969aa5e27876c4454d2e32b42a36f5b))
26
- * release 0.3.1 ([c1395b1](https://github.com/b-long/opentdf-python-sdk/commit/c1395b1ff6bf02ffb24f20e7d45ca0869ae033f5))
27
-
28
- ## Changelog
@@ -1,18 +0,0 @@
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.
File without changes