otdf-python 0.3.0__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.
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/check_entitlements.sh +8 -1
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/workflows/platform-integration-test.yaml +1 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/workflows/release-please.yaml +3 -3
- otdf_python-0.3.2/.release-please-manifest.json +3 -0
- otdf_python-0.3.2/CHANGELOG.md +26 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/PKG-INFO +6 -80
- {otdf_python-0.3.0 → otdf_python-0.3.2}/README.md +5 -79
- otdf_python-0.3.2/docs/DEVELOPING.md +95 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/pyproject.toml +1 -1
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/uv.lock +1 -1
- {otdf_python-0.3.0 → otdf_python-0.3.2}/pyproject.toml +1 -1
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/cli.py +3 -11
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/sdk.py +8 -22
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_pe_interaction.py +1 -1
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_validate_otdf_python.py +1 -7
- {otdf_python-0.3.0 → otdf_python-0.3.2}/uv.lock +1 -1
- otdf_python-0.3.0/.release-please-manifest.json +0 -3
- otdf_python-0.3.0/CHANGELOG.md +0 -12
- otdf_python-0.3.0/docs/DEVELOPING.md +0 -18
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/start_opentdf_docker.sh +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/workflows/build-python.yaml +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.github/workflows/test-suite.yaml +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.gitignore +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.pre-commit-config.yaml +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.release-please-config-develop.json +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.release-please-config.json +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.release-please-manifest-develop.json +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.vscode/extensions.json +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/.vscode/settings.json +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/LICENSE +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/conftest.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/docs/CONNECT_RPC_MIGRATION.md +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/docs/LEGACY_VERSION.md +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/docs/PROTOBUF_SETUP.md +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/docs/RELEASES.md +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/README.md +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/buf.gen.yaml +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/buf.lock +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/buf.yaml +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/authorization/authorization.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/authorization/v2/authorization.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/common/common.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entity/entity.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/kas/kas.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/logger/audit/test.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/actions/actions.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/attributes/attributes.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/objects.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/selectors.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/scripts/build_connect_proto.sh +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/scripts/generate_connect_proto.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/scripts/setup_connect_rpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → 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
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2_connect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/__main__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/address_normalizer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/aesgcm.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/assertion_config.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/asym_crypto.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/asym_decryption.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/asym_encryption.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/auth_headers.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/autoconfigure_utils.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/collection_store.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/collection_store_impl.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/config.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/connect_client.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/constants.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/crypto_utils.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/dpop.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/ecc_mode.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/eckeypair.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/header.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/invalid_zip_exception.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/kas_client.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/kas_connect_rpc_client.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/kas_info.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/kas_key_cache.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/key_type.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/key_type_constants.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/manifest.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/nanotdf.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/nanotdf_ecdsa_struct.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/nanotdf_type.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/policy_binding_serializer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/policy_info.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/policy_object.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/policy_stub.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/resource_locator.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/sdk_builder.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/sdk_exceptions.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/symmetric_and_payload_config.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/tdf.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/tdf_reader.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/tdf_writer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/token_source.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/version.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/zip_reader.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/src/otdf_python/zip_writer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/__init__.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/config_pydantic.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/conftest.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/otdfctl_only/test_otdfctl_generated_fixtures.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_comparison.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_decrypt.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_cli_inspect.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/python_only/test_kas_client_integration.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/support_sdk.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_cli_integration.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_cli_tdf_validation.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_data/empty_file.txt +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_data/sample_binary.png +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_data/sample_text.txt +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/integration/test_data/sample_with_attributes.txt +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/mock_crypto.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/server_logs.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/support_cli_args.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/support_common.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/support_otdfctl.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/support_otdfctl_args.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_address_normalizer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_aesgcm.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_assertion_config.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_asym_encryption.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_autoconfigure_utils.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_cli.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_collection_store.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_config.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_crypto_utils.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_eckeypair.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_header.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_inner_classes.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_kas_client.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_kas_key_cache.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_kas_key_management.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_key_type.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_log_collection.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_manifest.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_manifest_format.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_nanotdf.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_nanotdf_ecdsa_struct.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_nanotdf_integration.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_nanotdf_type.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_policy_object.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_sdk.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_sdk_builder.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_sdk_exceptions.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_sdk_mock.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_sdk_tdf_integration.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_tdf.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_tdf_key_management.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_tdf_reader.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_tdf_writer.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_token_source.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_url_normalization.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_use_plaintext_flow.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_version.py +0 -0
- {otdf_python-0.3.0 → otdf_python-0.3.2}/tests/test_zip_reader.py +0 -0
- {otdf_python-0.3.0 → 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}"
|
|
@@ -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,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.
|
|
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.
|
|
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
|
-
|
|
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 '
|
|
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.
|
|
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
|
-
|
|
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 '
|
|
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.
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
352
|
-
self,
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
otdf_python-0.3.0/CHANGELOG.md
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
## [0.3.0](https://github.com/b-long/opentdf-python-sdk/compare/v0.2.20...otdf-python-v0.3.0) (2025-09-11)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
### ⚠ BREAKING CHANGES
|
|
7
|
-
|
|
8
|
-
* rewrite in pure Python ([#62](https://github.com/b-long/opentdf-python-sdk/issues/62))
|
|
9
|
-
|
|
10
|
-
### Features
|
|
11
|
-
|
|
12
|
-
* 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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|