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.
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/check_entitlements.sh +8 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/build-python.yaml +0 -3
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/platform-integration-test.yaml +1 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/release-please.yaml +3 -3
- otdf_python-0.3.3/.release-please-manifest.json +3 -0
- otdf_python-0.3.3/CHANGELOG.md +33 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/PKG-INFO +6 -82
- {otdf_python-0.3.1 → otdf_python-0.3.3}/README.md +5 -81
- otdf_python-0.3.3/docs/CONNECT_RPC.md +156 -0
- otdf_python-0.3.3/docs/DEVELOPING.md +95 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/README.md +2 -2
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/pyproject.toml +1 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/build_connect_proto.sh +1 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/uv.lock +1 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/pyproject.toml +1 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/cli.py +3 -11
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk.py +8 -22
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_pe_interaction.py +1 -1
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_validate_otdf_python.py +1 -7
- {otdf_python-0.3.1 → otdf_python-0.3.3}/uv.lock +1 -1
- otdf_python-0.3.1/.release-please-manifest.json +0 -3
- otdf_python-0.3.1/CHANGELOG.md +0 -28
- otdf_python-0.3.1/docs/CONNECT_RPC_MIGRATION.md +0 -283
- otdf_python-0.3.1/docs/DEVELOPING.md +0 -18
- otdf_python-0.3.1/docs/PROTOBUF_SETUP.md +0 -135
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/start_opentdf_docker.sh +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.github/workflows/test-suite.yaml +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.gitignore +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.pre-commit-config.yaml +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-config-develop.json +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-config.json +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.release-please-manifest-develop.json +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.vscode/extensions.json +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/.vscode/settings.json +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/LICENSE +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/conftest.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/docs/LEGACY_VERSION.md +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/docs/RELEASES.md +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.gen.yaml +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.lock +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/buf.yaml +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/authorization/authorization.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/authorization/v2/authorization.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/common/common.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entity/entity.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/kas/kas.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/logger/audit/test.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/actions/actions.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/attributes/attributes.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/objects.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/selectors.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/generate_connect_proto.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/scripts/setup_connect_rpc.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2_connect.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi +0 -0
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi +0 -0
- {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
- {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
- {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
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2_connect.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi +0 -0
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi +0 -0
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi +0 -0
- {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
- {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
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi +0 -0
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi +0 -0
- {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
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/__main__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/address_normalizer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/aesgcm.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/assertion_config.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_crypto.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_decryption.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/asym_encryption.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/auth_headers.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/autoconfigure_utils.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/collection_store.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/collection_store_impl.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/config.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/connect_client.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/constants.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/crypto_utils.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/dpop.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/ecc_mode.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/eckeypair.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/header.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/invalid_zip_exception.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_client.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_connect_rpc_client.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_info.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/kas_key_cache.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/key_type.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/key_type_constants.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/manifest.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf_ecdsa_struct.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/nanotdf_type.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_binding_serializer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_info.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_object.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/policy_stub.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/resource_locator.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk_builder.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/sdk_exceptions.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/symmetric_and_payload_config.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf_reader.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/tdf_writer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/token_source.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/version.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/zip_reader.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/src/otdf_python/zip_writer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/__init__.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/config_pydantic.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/conftest.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_only/test_otdfctl_generated_fixtures.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_comparison.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_decrypt.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_cli_inspect.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/python_only/test_kas_client_integration.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/support_sdk.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_cli_integration.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_cli_tdf_validation.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/empty_file.txt +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_binary.png +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_text.txt +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/integration/test_data/sample_with_attributes.txt +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/mock_crypto.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/server_logs.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_cli_args.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_common.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_otdfctl.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/support_otdfctl_args.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_address_normalizer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_aesgcm.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_assertion_config.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_asym_encryption.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_autoconfigure_utils.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_cli.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_collection_store.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_config.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_crypto_utils.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_eckeypair.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_header.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_inner_classes.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_client.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_key_cache.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_kas_key_management.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_key_type.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_log_collection.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_manifest.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_manifest_format.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_ecdsa_struct.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_integration.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_nanotdf_type.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_policy_object.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_builder.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_exceptions.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_mock.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_sdk_tdf_integration.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_key_management.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_reader.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_tdf_writer.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_token_source.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_url_normalization.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_use_plaintext_flow.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_version.py +0 -0
- {otdf_python-0.3.1 → otdf_python-0.3.3}/tests/test_zip_reader.py +0 -0
- {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}"
|
|
@@ -46,14 +46,14 @@ jobs:
|
|
|
46
46
|
target-branch: main
|
|
47
47
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
48
48
|
|
|
49
|
-
#
|
|
50
|
-
|
|
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,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.
|
|
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.
|
|
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
|
-
|
|
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 '
|
|
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.
|
|
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
|
-
|
|
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 '
|
|
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 [
|
|
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](../
|
|
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
|
|
@@ -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 " -
|
|
90
|
+
echo " - docs/CONNECT_RPC.md"
|
|
91
91
|
echo " - https://connectrpc.com/docs/"
|
|
92
92
|
else
|
|
93
93
|
echo "✗ Connect RPC generation failed!"
|