otdf-python 0.4.2__tar.gz → 0.4.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/workflows/platform-integration-test.yaml +2 -2
  2. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/workflows/test-suite.yaml +23 -3
  3. {otdf_python-0.4.2 → otdf_python-0.4.4}/.pre-commit-config.yaml +3 -3
  4. otdf_python-0.4.4/.release-please-manifest.json +3 -0
  5. {otdf_python-0.4.2 → otdf_python-0.4.4}/CHANGELOG.md +14 -0
  6. {otdf_python-0.4.2 → otdf_python-0.4.4}/PKG-INFO +1 -1
  7. {otdf_python-0.4.2 → otdf_python-0.4.4}/docs/DEVELOPING.md +1 -1
  8. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/README.md +1 -1
  9. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/pyproject.toml +5 -1
  10. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/scripts/build_connect_proto.sh +13 -17
  11. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/scripts/generate_connect_proto.py +29 -22
  12. otdf_python-0.4.4/otdf-python-proto/scripts/setup_connect_rpc.py +26 -0
  13. otdf_python-0.4.2/otdf-python-proto/scripts/setup_connect_rpc.py → otdf_python-0.4.4/otdf-python-proto/tests/__init__.py +0 -0
  14. otdf_python-0.4.4/otdf-python-proto/tests/test_generate_connect_proto.py +355 -0
  15. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/uv.lock +135 -2
  16. {otdf_python-0.4.2 → otdf_python-0.4.4}/pyproject.toml +1 -1
  17. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/cli.py +50 -21
  18. otdf_python-0.4.4/src/otdf_python/kas_allowlist.py +182 -0
  19. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/kas_client.py +26 -2
  20. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/nanotdf.py +4 -6
  21. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/sdk.py +30 -0
  22. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/sdk_builder.py +86 -2
  23. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/tdf.py +2 -2
  24. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/config_pydantic.py +3 -1
  25. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/support_otdfctl_args.py +2 -2
  26. otdf_python-0.4.4/tests/test_kas_allowlist.py +333 -0
  27. otdf_python-0.4.4/uv.lock +849 -0
  28. otdf_python-0.4.2/.release-please-manifest.json +0 -3
  29. otdf_python-0.4.2/uv.lock +0 -849
  30. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/check_entitlements.sh +0 -0
  31. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/start_opentdf_docker.sh +0 -0
  32. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/workflows/build-python.yaml +0 -0
  33. {otdf_python-0.4.2 → otdf_python-0.4.4}/.github/workflows/release-please.yaml +0 -0
  34. {otdf_python-0.4.2 → otdf_python-0.4.4}/.gitignore +0 -0
  35. {otdf_python-0.4.2 → otdf_python-0.4.4}/.release-please-config-develop.json +0 -0
  36. {otdf_python-0.4.2 → otdf_python-0.4.4}/.release-please-config.json +0 -0
  37. {otdf_python-0.4.2 → otdf_python-0.4.4}/.release-please-manifest-develop.json +0 -0
  38. {otdf_python-0.4.2 → otdf_python-0.4.4}/.vscode/extensions.json +0 -0
  39. {otdf_python-0.4.2 → otdf_python-0.4.4}/.vscode/settings.json +0 -0
  40. {otdf_python-0.4.2 → otdf_python-0.4.4}/LICENSE +0 -0
  41. {otdf_python-0.4.2 → otdf_python-0.4.4}/README.md +0 -0
  42. {otdf_python-0.4.2 → otdf_python-0.4.4}/conftest.py +0 -0
  43. {otdf_python-0.4.2 → otdf_python-0.4.4}/docs/CONNECT_RPC.md +0 -0
  44. {otdf_python-0.4.2 → otdf_python-0.4.4}/docs/LEGACY_VERSION.md +0 -0
  45. {otdf_python-0.4.2 → otdf_python-0.4.4}/docs/RELEASES.md +0 -0
  46. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/buf.gen.yaml +0 -0
  47. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/buf.lock +0 -0
  48. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/buf.yaml +0 -0
  49. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/generated/__init__.py +0 -0
  50. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/authorization/authorization.proto +0 -0
  51. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/authorization/v2/authorization.proto +0 -0
  52. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/common/common.proto +0 -0
  53. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/entity/entity.proto +0 -0
  54. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/entityresolution/entity_resolution.proto +0 -0
  55. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/entityresolution/v2/entity_resolution.proto +0 -0
  56. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/kas/kas.proto +0 -0
  57. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/logger/audit/test.proto +0 -0
  58. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/actions/actions.proto +0 -0
  59. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/attributes/attributes.proto +0 -0
  60. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/kasregistry/key_access_server_registry.proto +0 -0
  61. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/keymanagement/key_management.proto +0 -0
  62. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/namespaces/namespaces.proto +0 -0
  63. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/objects.proto +0 -0
  64. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/registeredresources/registered_resources.proto +0 -0
  65. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/resourcemapping/resource_mapping.proto +0 -0
  66. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/selectors.proto +0 -0
  67. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/subjectmapping/subject_mapping.proto +0 -0
  68. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/policy/unsafe/unsafe.proto +0 -0
  69. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/proto-files/wellknownconfiguration/wellknown_configuration.proto +0 -0
  70. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/__init__.py +0 -0
  71. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/__init__.py +0 -0
  72. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_connect.py +0 -0
  73. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.py +0 -0
  74. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/authorization_pb2.pyi +0 -0
  75. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_connect.py +0 -0
  76. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.py +0 -0
  77. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/authorization/v2/authorization_pb2.pyi +0 -0
  78. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/common/__init__.py +0 -0
  79. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.py +0 -0
  80. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/common/common_pb2.pyi +0 -0
  81. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entity/__init__.py +0 -0
  82. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.py +0 -0
  83. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entity/entity_pb2.pyi +0 -0
  84. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/__init__.py +0 -0
  85. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_connect.py +0 -0
  86. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.py +0 -0
  87. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/entity_resolution_pb2.pyi +0 -0
  88. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_connect.py +0 -0
  89. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.py +0 -0
  90. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/entityresolution/v2/entity_resolution_pb2.pyi +0 -0
  91. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/kas/__init__.py +0 -0
  92. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/kas/kas_connect.py +0 -0
  93. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.py +0 -0
  94. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/kas/kas_pb2.pyi +0 -0
  95. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/__init__.py +0 -0
  96. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/authorization_pb2_grpc.py +0 -0
  97. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/authorization/v2/authorization_pb2_grpc.py +0 -0
  98. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/common/common_pb2_grpc.py +0 -0
  99. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entity/entity_pb2_grpc.py +0 -0
  100. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/entity_resolution_pb2_grpc.py +0 -0
  101. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/entityresolution/v2/entity_resolution_pb2_grpc.py +0 -0
  102. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/kas/kas_pb2_grpc.py +0 -0
  103. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/logger/audit/test_pb2_grpc.py +0 -0
  104. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/actions/actions_pb2_grpc.py +0 -0
  105. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/attributes/attributes_pb2_grpc.py +0 -0
  106. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/kasregistry/key_access_server_registry_pb2_grpc.py +0 -0
  107. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/keymanagement/key_management_pb2_grpc.py +0 -0
  108. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/namespaces/namespaces_pb2_grpc.py +0 -0
  109. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/objects_pb2_grpc.py +0 -0
  110. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/registeredresources/registered_resources_pb2_grpc.py +0 -0
  111. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/resourcemapping/resource_mapping_pb2_grpc.py +0 -0
  112. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/selectors_pb2_grpc.py +0 -0
  113. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/subjectmapping/subject_mapping_pb2_grpc.py +0 -0
  114. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/policy/unsafe/unsafe_pb2_grpc.py +0 -0
  115. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/legacy_grpc/wellknownconfiguration/wellknown_configuration_pb2_grpc.py +0 -0
  116. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/logger/__init__.py +0 -0
  117. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.py +0 -0
  118. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/logger/audit/test_pb2.pyi +0 -0
  119. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/__init__.py +0 -0
  120. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/actions/__init__.py +0 -0
  121. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_connect.py +0 -0
  122. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.py +0 -0
  123. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/actions/actions_pb2.pyi +0 -0
  124. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/attributes/__init__.py +0 -0
  125. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_connect.py +0 -0
  126. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.py +0 -0
  127. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/attributes/attributes_pb2.pyi +0 -0
  128. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/__init__.py +0 -0
  129. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_connect.py +0 -0
  130. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.py +0 -0
  131. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/kasregistry/key_access_server_registry_pb2.pyi +0 -0
  132. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/__init__.py +0 -0
  133. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_connect.py +0 -0
  134. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.py +0 -0
  135. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/keymanagement/key_management_pb2.pyi +0 -0
  136. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/__init__.py +0 -0
  137. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_connect.py +0 -0
  138. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.py +0 -0
  139. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/namespaces/namespaces_pb2.pyi +0 -0
  140. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.py +0 -0
  141. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/objects_pb2.pyi +0 -0
  142. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/__init__.py +0 -0
  143. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_connect.py +0 -0
  144. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.py +0 -0
  145. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/registeredresources/registered_resources_pb2.pyi +0 -0
  146. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/__init__.py +0 -0
  147. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_connect.py +0 -0
  148. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.py +0 -0
  149. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/resourcemapping/resource_mapping_pb2.pyi +0 -0
  150. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.py +0 -0
  151. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/selectors_pb2.pyi +0 -0
  152. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/__init__.py +0 -0
  153. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_connect.py +0 -0
  154. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.py +0 -0
  155. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/subjectmapping/subject_mapping_pb2.pyi +0 -0
  156. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/__init__.py +0 -0
  157. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_connect.py +0 -0
  158. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.py +0 -0
  159. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/policy/unsafe/unsafe_pb2.pyi +0 -0
  160. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/__init__.py +0 -0
  161. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_connect.py +0 -0
  162. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.py +0 -0
  163. {otdf_python-0.4.2 → otdf_python-0.4.4}/otdf-python-proto/src/otdf_python_proto/wellknownconfiguration/wellknown_configuration_pb2.pyi +0 -0
  164. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/__init__.py +0 -0
  165. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/__main__.py +0 -0
  166. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/address_normalizer.py +0 -0
  167. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/aesgcm.py +0 -0
  168. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/assertion_config.py +0 -0
  169. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/asym_crypto.py +0 -0
  170. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/auth_headers.py +0 -0
  171. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/autoconfigure_utils.py +0 -0
  172. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/collection_store.py +0 -0
  173. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/collection_store_impl.py +0 -0
  174. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/config.py +0 -0
  175. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/connect_client.py +0 -0
  176. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/constants.py +0 -0
  177. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/crypto_utils.py +0 -0
  178. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/dpop.py +0 -0
  179. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/ecc_constants.py +0 -0
  180. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/ecc_mode.py +0 -0
  181. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/ecdh.py +0 -0
  182. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/eckeypair.py +0 -0
  183. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/header.py +0 -0
  184. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/invalid_zip_exception.py +0 -0
  185. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/kas_connect_rpc_client.py +0 -0
  186. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/kas_info.py +0 -0
  187. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/kas_key_cache.py +0 -0
  188. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/key_type.py +0 -0
  189. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/key_type_constants.py +0 -0
  190. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/manifest.py +0 -0
  191. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/nanotdf_ecdsa_struct.py +0 -0
  192. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/nanotdf_type.py +0 -0
  193. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/policy_binding_serializer.py +0 -0
  194. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/policy_info.py +0 -0
  195. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/policy_object.py +0 -0
  196. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/policy_stub.py +0 -0
  197. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/resource_locator.py +0 -0
  198. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/sdk_exceptions.py +0 -0
  199. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/symmetric_and_payload_config.py +0 -0
  200. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/tdf_reader.py +0 -0
  201. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/tdf_writer.py +0 -0
  202. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/token_source.py +0 -0
  203. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/version.py +0 -0
  204. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/zip_reader.py +0 -0
  205. {otdf_python-0.4.2 → otdf_python-0.4.4}/src/otdf_python/zip_writer.py +0 -0
  206. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/__init__.py +0 -0
  207. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/conftest.py +0 -0
  208. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_only/test_otdfctl_generated_fixtures.py +0 -0
  209. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_cli_comparison.py +0 -0
  210. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_cli_decrypt.py +0 -0
  211. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_cli_inspect.py +0 -0
  212. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_nanotdf_cli_comparison.py +0 -0
  213. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_python_nanotdf_only.py +0 -0
  214. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/otdfctl_to_python/test_tdf_reader_integration.py +0 -0
  215. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/python_only/test_kas_client_integration.py +0 -0
  216. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/support_sdk.py +0 -0
  217. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_cli_integration.py +0 -0
  218. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_cli_tdf_validation.py +0 -0
  219. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_data/empty_file.txt +0 -0
  220. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_data/sample_binary.png +0 -0
  221. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_data/sample_text.txt +0 -0
  222. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_data/sample_with_attributes.txt +0 -0
  223. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/integration/test_pe_interaction.py +0 -0
  224. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/mock_crypto.py +0 -0
  225. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/server_logs.py +0 -0
  226. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/support_cli_args.py +0 -0
  227. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/support_common.py +0 -0
  228. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/support_otdfctl.py +0 -0
  229. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_address_normalizer.py +0 -0
  230. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_aesgcm.py +0 -0
  231. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_assertion_config.py +0 -0
  232. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_asym_encryption.py +0 -0
  233. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_autoconfigure_utils.py +0 -0
  234. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_cli.py +0 -0
  235. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_collection_store.py +0 -0
  236. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_config.py +0 -0
  237. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_crypto_utils.py +0 -0
  238. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_ecdh.py +0 -0
  239. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_eckeypair.py +0 -0
  240. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_header.py +0 -0
  241. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_inner_classes.py +0 -0
  242. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_kas_client.py +0 -0
  243. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_kas_key_cache.py +0 -0
  244. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_kas_key_management.py +0 -0
  245. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_key_type.py +0 -0
  246. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_log_collection.py +0 -0
  247. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_manifest.py +0 -0
  248. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_manifest_format.py +0 -0
  249. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_nanotdf.py +0 -0
  250. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_nanotdf_ecdh.py +0 -0
  251. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_nanotdf_ecdsa_struct.py +0 -0
  252. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_nanotdf_integration.py +0 -0
  253. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_nanotdf_type.py +0 -0
  254. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_policy_object.py +0 -0
  255. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_sdk.py +0 -0
  256. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_sdk_builder.py +0 -0
  257. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_sdk_exceptions.py +0 -0
  258. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_sdk_mock.py +0 -0
  259. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_sdk_tdf_integration.py +0 -0
  260. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_tdf.py +0 -0
  261. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_tdf_key_management.py +0 -0
  262. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_tdf_reader.py +0 -0
  263. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_tdf_writer.py +0 -0
  264. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_token_source.py +0 -0
  265. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_url_normalization.py +0 -0
  266. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_use_plaintext_flow.py +0 -0
  267. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_validate_otdf_python.py +0 -0
  268. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_version.py +0 -0
  269. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_zip_reader.py +0 -0
  270. {otdf_python-0.4.2 → otdf_python-0.4.4}/tests/test_zip_writer.py +0 -0
@@ -33,7 +33,7 @@ jobs:
33
33
  uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
34
34
  with:
35
35
  repository: opentdf/platform
36
- ref: main
36
+ ref: service/v0.8.2
37
37
  path: platform
38
38
  - name: Set up go
39
39
  uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491
@@ -132,7 +132,7 @@ jobs:
132
132
  grpcurl -plaintext localhost:8080 kas.AccessService/PublicKey
133
133
 
134
134
  - name: Install otdfctl
135
- run: go install github.com/opentdf/otdfctl@latest
135
+ run: go install github.com/opentdf/otdfctl@v0.28.0
136
136
  shell: bash
137
137
 
138
138
  - name: Create creds.json for otdfctl
@@ -32,7 +32,26 @@ jobs:
32
32
  uv run ruff check
33
33
  uv run ruff format --check
34
34
 
35
- # Step 2: Build (only after linting passes)
35
+ # Step 2a: Proto sub-project unit tests (runs in parallel with build)
36
+ proto-unit-tests:
37
+ runs-on: ubuntu-22.04
38
+ needs: lint-check
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+
42
+ - name: Set up uv
43
+ uses: astral-sh/setup-uv@v6
44
+ with:
45
+ enable-cache: true
46
+ cache-dependency-glob: "otdf-python-proto/uv.lock"
47
+
48
+ - name: Run otdf-python-proto unit tests
49
+ working-directory: otdf-python-proto
50
+ run: |
51
+ uv sync --frozen --group dev
52
+ uv run pytest --tb=short -v tests/
53
+
54
+ # Step 2b: Build (only after linting passes)
36
55
  build:
37
56
  runs-on: ubuntu-22.04
38
57
  needs: lint-check
@@ -99,7 +118,7 @@ jobs:
99
118
 
100
119
  report:
101
120
  runs-on: ubuntu-22.04
102
- needs: [lint-check, build, unit-tests, integration-tests]
121
+ needs: [lint-check, proto-unit-tests, build, unit-tests, integration-tests]
103
122
  if: always()
104
123
  outputs:
105
124
  success: ${{ steps.check.outputs.success }}
@@ -107,13 +126,14 @@ jobs:
107
126
  - name: Check all jobs succeeded
108
127
  id: check
109
128
  run: |
110
- if [[ "${{ needs.lint-check.result }}" == "success" && "${{ needs.build.result }}" == "success" && "${{ needs.unit-tests.result }}" == "success" && "${{ needs.integration-tests.result }}" == "success" ]]; then
129
+ if [[ "${{ needs.lint-check.result }}" == "success" && "${{ needs.proto-unit-tests.result }}" == "success" && "${{ needs.build.result }}" == "success" && "${{ needs.unit-tests.result }}" == "success" && "${{ needs.integration-tests.result }}" == "success" ]]; then
111
130
  echo "success=true" >> $GITHUB_OUTPUT
112
131
  echo "✅ All tests passed!"
113
132
  else
114
133
  echo "success=false" >> $GITHUB_OUTPUT
115
134
  echo "❌ Some tests failed:"
116
135
  echo " Lint Check: ${{ needs.lint-check.result }}"
136
+ echo " Proto Unit Tests: ${{ needs.proto-unit-tests.result }}"
117
137
  echo " Build: ${{ needs.build.result }}"
118
138
  echo " Unit Tests: ${{ needs.unit-tests.result }}"
119
139
  echo " Integration Tests: ${{ needs.integration-tests.result }}"
@@ -22,7 +22,7 @@ repos:
22
22
  - id: end-of-file-fixer
23
23
  - id: trailing-whitespace
24
24
  - repo: https://github.com/codespell-project/codespell
25
- rev: v2.4.1
25
+ rev: v2.4.2
26
26
  hooks:
27
27
  - id: codespell
28
28
  args:
@@ -34,14 +34,14 @@ repos:
34
34
 
35
35
  - repo: https://github.com/astral-sh/ruff-pre-commit
36
36
  # Ruff version.
37
- rev: v0.14.8
37
+ rev: v0.15.12
38
38
  hooks:
39
39
  # Run the linter.
40
40
  - id: ruff-check
41
41
  # Run the formatter.
42
42
  - id: ruff-format
43
43
  - repo: https://github.com/compilerla/conventional-pre-commit
44
- rev: v4.3.0
44
+ rev: v4.4.0
45
45
  hooks:
46
46
  - id: conventional-pre-commit
47
47
  stages: [commit-msg]
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.4.4"
3
+ }
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.4.4](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.4.3...otdf-python-v0.4.4) (2026-04-30)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **proto-gen:** fix buf plugin path replacement, GIT_TAG, and generated_dir ([#135](https://github.com/b-long/opentdf-python-sdk/issues/135)) ([88d227d](https://github.com/b-long/opentdf-python-sdk/commit/88d227d83eb5e1903e5a2ef86dc38ea016885f60))
9
+
10
+ ## [0.4.3](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.4.2...otdf-python-v0.4.3) (2026-02-05)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * implement KAS allowlist functionality ([#129](https://github.com/b-long/opentdf-python-sdk/issues/129)) ([c1306da](https://github.com/b-long/opentdf-python-sdk/commit/c1306da24eb27f80bb3f1c11cea0f24175b5fd23))
16
+
3
17
  ## [0.4.2](https://github.com/b-long/opentdf-python-sdk/compare/otdf-python-v0.4.1...otdf-python-v0.4.2) (2026-01-07)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: otdf-python
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: Unofficial OpenTDF SDK for Python
5
5
  Project-URL: Homepage, https://github.com/b-long/opentdf-python-sdk
6
6
  Project-URL: Repository, https://github.com/b-long/opentdf-python-sdk
@@ -92,4 +92,4 @@ cd otdf-python-proto
92
92
  uv run python scripts/generate_connect_proto.py
93
93
  ```
94
94
 
95
- See [`otdf-python-proto/README.md`](../otdf-python-proto/README.md) and [`PROTOBUF_SETUP.md`](./PROTOBUF_SETUP.md) for details.
95
+ See [`otdf-python-proto/README.md`](../otdf-python-proto/README.md) and [`CONNECT_RPC.md`](./CONNECT_RPC.md) for details.
@@ -170,7 +170,7 @@ If you're migrating from traditional gRPC clients to Connect RPC:
170
170
  Install buf: `brew install bufbuild/buf/buf`
171
171
 
172
172
  ### "protoc-gen-connect_python not found"
173
- Install with compiler support: `uv add connect-python[compiler]`
173
+ Run the setup script: `uv run python scripts/setup_connect_rpc.py`
174
174
 
175
175
  ### Import errors after generation
176
176
  Ensure `__init__.py` files exist in otdf_python_proto directories
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "otdf-python-proto"
3
- version = "0.4.2"
3
+ version = "0.4.4"
4
4
  description = "Generated protobuf files for OpenTDF Python SDK"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -23,8 +23,12 @@ build-backend = "hatchling.build"
23
23
  [dependency-groups]
24
24
  dev = [
25
25
  "mypy-protobuf>=3.6.0",
26
+ "pytest>=8.0.0",
26
27
  ]
27
28
 
29
+ [tool.pytest.ini_options]
30
+ testpaths = ["tests"]
31
+
28
32
  [tool.hatch.build.targets.wheel]
29
33
  packages = ["src/otdf_python_proto"]
30
34
 
@@ -44,28 +44,28 @@ fi
44
44
 
45
45
  echo "✓ uv is available"
46
46
 
47
- # Install dependencies if needed
47
+ # Install dependencies
48
48
  echo "Installing/updating dependencies..."
49
49
  cd "$PROTO_GEN_DIR"
50
- uv sync --dev
50
+ uv sync
51
51
 
52
52
  # Check if connect-python is available
53
53
  if ! uv run python -c "import connectrpc" 2>/dev/null; then
54
- echo "Installing connect-python[compiler]..."
55
- uv add "connect-python[compiler]>=0.4.2"
54
+ echo "Error: connect-python is not in the installed dependencies."
55
+ echo "It may need to be added first. Run: uv run python scripts/setup_connect_rpc.py"
56
+ echo "Then re-run this script."
57
+ exit 1
56
58
  fi
57
59
 
58
60
  echo "✓ connect-python is available"
59
61
 
60
62
  # Clean up previous generated files
63
+ OUTPUT_DIR="$PROTO_GEN_DIR/src/otdf_python_proto"
61
64
  echo "Cleaning up previous generated files..."
62
- if [[ -d "generated" ]]; then
63
- rm -rf generated/*
65
+ if [[ -d "$OUTPUT_DIR" ]]; then
66
+ rm -rf "${OUTPUT_DIR:?}"/*
64
67
  fi
65
68
 
66
- # Create generated directory
67
- mkdir -p generated
68
-
69
69
  # Run the generation
70
70
  echo "Generating Connect RPC protobuf files..."
71
71
  uv run python scripts/generate_connect_proto.py "$@"
@@ -75,16 +75,12 @@ if [[ $? -eq 0 ]]; then
75
75
  echo "✓ Connect RPC generation complete!"
76
76
  echo ""
77
77
  echo "Generated files:"
78
- echo " - generated/*_pb2.py (Protobuf message classes)"
79
- echo " - generated/*_pb2.pyi (Type stubs)"
80
- echo " - generated/*_connect.py (Connect RPC clients)"
78
+ echo " - src/otdf_python_proto/**/*_pb2.py (Protobuf message classes)"
79
+ echo " - src/otdf_python_proto/**/*_pb2.pyi (Type stubs)"
80
+ echo " - src/otdf_python_proto/**/*_connect.py (Connect RPC clients)"
81
81
  echo ""
82
82
  echo "Legacy gRPC files (if generated):"
83
- echo " - generated/legacy_grpc/*_pb2_grpc.py (gRPC stubs)"
84
- echo ""
85
- echo "Usage examples:"
86
- echo " cd .."
87
- echo " python examples/connect_rpc_client_example.py"
83
+ echo " - src/otdf_python_proto/legacy_grpc/**/*_pb2_grpc.py (gRPC stubs)"
88
84
  echo ""
89
85
  echo "For more information, see:"
90
86
  echo " - docs/CONNECT_RPC.md"
@@ -8,6 +8,9 @@ This script:
8
8
  4. Optionally generates legacy gRPC clients for backward compatibility
9
9
  """
10
10
 
11
+ import argparse
12
+ import re
13
+ import shutil
11
14
  import subprocess
12
15
  import sys
13
16
  from pathlib import Path
@@ -43,9 +46,9 @@ def check_dependencies() -> bool:
43
46
  return True
44
47
 
45
48
 
46
- def copy_opentdf_proto_files(proto_gen_dir: Path) -> bool:
49
+ def copy_opentdf_proto_files(proto_gen_dir: Path, git_tag: str | None = None) -> bool:
47
50
  """Clone OpenTDF platform repository and copy all proto files."""
48
- GIT_TAG = "service/v0.7.2"
51
+ GIT_TAG = git_tag or "service/v0.7.2"
49
52
  REPO_URL = "https://github.com/opentdf/platform.git"
50
53
 
51
54
  temp_repo_dir = proto_gen_dir / "temp_platform_repo"
@@ -57,7 +60,7 @@ def copy_opentdf_proto_files(proto_gen_dir: Path) -> bool:
57
60
  try:
58
61
  # Remove existing temp directory if it exists
59
62
  if temp_repo_dir.exists():
60
- subprocess.run(["rm", "-rf", str(temp_repo_dir)], check=True)
63
+ shutil.rmtree(temp_repo_dir)
61
64
 
62
65
  print(f"Cloning OpenTDF platform repository (tag: {GIT_TAG})...")
63
66
 
@@ -120,17 +123,15 @@ def copy_opentdf_proto_files(proto_gen_dir: Path) -> bool:
120
123
  finally:
121
124
  # Clean up temp directory
122
125
  if temp_repo_dir.exists():
123
- subprocess.run(["rm", "-rf", str(temp_repo_dir)], check=False)
126
+ shutil.rmtree(temp_repo_dir)
124
127
 
125
- return False
126
128
 
127
-
128
- def download_proto_files(proto_gen_dir: Path) -> bool:
129
+ def download_proto_files(proto_gen_dir: Path, git_tag: str | None = None) -> bool:
129
130
  """Download proto files from OpenTDF platform."""
130
131
  print("Copying proto files from OpenTDF platform...")
131
132
 
132
133
  try:
133
- return copy_opentdf_proto_files(proto_gen_dir)
134
+ return copy_opentdf_proto_files(proto_gen_dir, git_tag=git_tag)
134
135
  except Exception as e:
135
136
  print(f"Error getting proto files: {e}")
136
137
  return False
@@ -152,14 +153,15 @@ def run_buf_generate(proto_gen_dir: Path) -> bool:
152
153
  connect_plugin_path = result.stdout.strip()
153
154
  print(f"Using Connect plugin at: {connect_plugin_path}")
154
155
 
155
- # Update buf.gen.yaml with the correct path
156
+ # Update buf.gen.yaml with the correct absolute path for the local plugin
156
157
  buf_gen_path = proto_gen_dir / "buf.gen.yaml"
157
158
  with buf_gen_path.open() as f:
158
159
  content = f.read()
159
160
 
160
- # Replace the local plugin path
161
- updated_content = content.replace(
162
- "- local: protoc-gen-connect-python", f"- local: {connect_plugin_path}"
161
+ updated_content = re.sub(
162
+ r"- local:\s+\S*protoc-gen-connect[_-]python\S*",
163
+ lambda _: f"- local: {connect_plugin_path}",
164
+ content,
163
165
  )
164
166
 
165
167
  with buf_gen_path.open("w") as f:
@@ -189,13 +191,9 @@ def run_buf_generate(proto_gen_dir: Path) -> bool:
189
191
 
190
192
  def create_init_files(generated_dir: Path) -> None:
191
193
  """Create __init__.py files in generated directories."""
192
- # Create __init__.py in main generated directory
193
- (generated_dir / "__init__.py").touch()
194
-
195
- # Create __init__.py files in any subdirectories
196
- for subdir in generated_dir.iterdir():
197
- if subdir.is_dir():
198
- (subdir / "__init__.py").touch()
194
+ for dirpath in [generated_dir, *generated_dir.rglob("*")]:
195
+ if dirpath.is_dir():
196
+ (dirpath / "__init__.py").touch()
199
197
 
200
198
 
201
199
  def _fix_ignore_if_default_value(proto_files_dir):
@@ -245,7 +243,7 @@ def main():
245
243
  # Get the proto-gen directory (parent of scripts)
246
244
  proto_gen_dir = Path(__file__).parent.parent
247
245
  proto_files_dir = proto_gen_dir / "proto-files"
248
- generated_dir = proto_gen_dir / "generated"
246
+ generated_dir = proto_gen_dir / "src" / "otdf_python_proto"
249
247
 
250
248
  # Check dependencies
251
249
  if not check_dependencies():
@@ -255,10 +253,19 @@ def main():
255
253
  proto_files_dir.mkdir(exist_ok=True)
256
254
  generated_dir.mkdir(exist_ok=True)
257
255
 
256
+ # Parse arguments
257
+ parser = argparse.ArgumentParser(description="OpenTDF Connect RPC Client Generator")
258
+ parser.add_argument("--tag", help="Git tag to use for OpenTDF platform")
259
+ parser.add_argument(
260
+ "--download", action="store_true", help="Force download of proto files"
261
+ )
262
+ args = parser.parse_args()
263
+ git_tag = args.tag
264
+
258
265
  # Download proto files (optional - can use existing files)
259
266
  if (
260
- "--download" in sys.argv or not any(proto_files_dir.glob("**/*.proto"))
261
- ) and not download_proto_files(proto_gen_dir):
267
+ args.download or not any(proto_files_dir.glob("**/*.proto"))
268
+ ) and not download_proto_files(proto_gen_dir, git_tag=git_tag):
262
269
  return 1
263
270
 
264
271
  # Check if we have any proto files
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env python3
2
+ """Setup script for Connect RPC dependencies.
3
+
4
+ Run this script once to install the required tools before generating proto files:
5
+
6
+ uv run python scripts/setup_connect_rpc.py
7
+ """
8
+
9
+ import subprocess
10
+ import sys
11
+
12
+
13
+ def main():
14
+ """Install Connect RPC compiler dependencies."""
15
+ print("Installing Connect RPC dependencies...")
16
+ subprocess.run(
17
+ ["uv", "sync"],
18
+ check=True,
19
+ )
20
+ print("✓ Connect RPC dependencies installed.")
21
+ print(" Run 'uv run python scripts/generate_connect_proto.py' to generate files.")
22
+ return 0
23
+
24
+
25
+ if __name__ == "__main__":
26
+ sys.exit(main())