Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion otdf-python-proto/buf.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ plugins:
out: src/otdf_python_proto

# Connect Python client generation (preferred)
- local: ../.venv/bin/protoc-gen-connect_python
- local: ../.venv/bin/protoc-gen-connect-python
out: src/otdf_python_proto
opt:
- paths=source_relative
Expand Down
Empty file.
8 changes: 4 additions & 4 deletions otdf-python-proto/scripts/generate_connect_proto.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def check_dependencies() -> bool:
print(" # macOS: brew install bufbuild/buf/buf")
print(" # Or: go install github.com/bufbuild/buf/cmd/buf@latest")
elif dep == "connect-python":
print(" uv add connect-python[compiler]")
print(" uv add connect-python protoc-gen-connect-python")
return False

return True
Expand Down Expand Up @@ -141,9 +141,9 @@ def run_buf_generate(proto_gen_dir: Path) -> bool:
print("Generating protobuf and Connect RPC files...")

try:
# First, get the path to protoc-gen-connect_python
# First, get the path to protoc-gen-connect-python
result = subprocess.run(
["uv", "run", "which", "protoc-gen-connect_python"],
["uv", "run", "which", "protoc-gen-connect-python"],
cwd=proto_gen_dir,
capture_output=True,
text=True,
Expand All @@ -159,7 +159,7 @@ def run_buf_generate(proto_gen_dir: Path) -> bool:

# Replace the local plugin path
updated_content = content.replace(
"- local: protoc-gen-connect_python", f"- local: {connect_plugin_path}"
"- local: protoc-gen-connect-python", f"- local: {connect_plugin_path}"
)

with buf_gen_path.open("w") as f:
Expand Down
8 changes: 2 additions & 6 deletions otdf-python-proto/src/otdf_python_proto/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,21 @@
__version__ = "0.0.0"

# Import submodules to make them available
from . import authorization
# Note: authorization, entityresolution, wellknownconfiguration and policy subdirectories
# are imported lazily to avoid import errors from generated protobuf files
from . import common
from . import entity
from . import entityresolution
from . import kas
from . import legacy_grpc
from . import logger
from . import policy
from . import wellknownconfiguration

# Export main module categories
__all__ = [
"authorization",
"common",
"entity",
"entityresolution",
"kas",
"legacy_grpc",
"logger",
"policy",
"wellknownconfiguration",
]
10 changes: 10 additions & 0 deletions otdf-python-proto/src/otdf_python_proto/authorization/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,11 @@
"""authorization protobuf definitions."""

from .authorization_connect import (
AuthorizationServiceClient,
AuthorizationServiceClientSync,
)

__all__ = [
"AuthorizationServiceClient",
"AuthorizationServiceClientSync",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,250 @@
# -*- coding: utf-8 -*-
# Generated by https://github.com/connectrpc/connect-python. DO NOT EDIT!
# source: authorization/authorization.proto

from collections.abc import AsyncGenerator, AsyncIterator, Iterable, Iterator, Mapping
from typing import Protocol

from connectrpc.client import ConnectClient, ConnectClientSync
from connectrpc.code import Code
from connectrpc.errors import ConnectError
from connectrpc.interceptor import Interceptor, InterceptorSync
from connectrpc.method import IdempotencyLevel, MethodInfo
from connectrpc.request import Headers, RequestContext
from connectrpc.server import ConnectASGIApplication, ConnectWSGIApplication, Endpoint, EndpointSync
from . import authorization_pb2 as authorization_dot_authorization__pb2


class AuthorizationService(Protocol):
async def get_decisions(self, request: authorization_dot_authorization__pb2.GetDecisionsRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetDecisionsResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")

async def get_decisions_by_token(self, request: authorization_dot_authorization__pb2.GetDecisionsByTokenRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetDecisionsByTokenResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")

async def get_entitlements(self, request: authorization_dot_authorization__pb2.GetEntitlementsRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetEntitlementsResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")


class AuthorizationServiceASGIApplication(ConnectASGIApplication[AuthorizationService]):
def __init__(self, service: AuthorizationService | AsyncGenerator[AuthorizationService], *, interceptors: Iterable[Interceptor]=(), read_max_bytes: int | None = None) -> None:
super().__init__(
service=service,
endpoints=lambda svc: {
"/authorization.AuthorizationService/GetDecisions": Endpoint.unary(
method=MethodInfo(
name="GetDecisions",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsRequest,
output=authorization_dot_authorization__pb2.GetDecisionsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=svc.get_decisions,
),
"/authorization.AuthorizationService/GetDecisionsByToken": Endpoint.unary(
method=MethodInfo(
name="GetDecisionsByToken",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
output=authorization_dot_authorization__pb2.GetDecisionsByTokenResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=svc.get_decisions_by_token,
),
"/authorization.AuthorizationService/GetEntitlements": Endpoint.unary(
method=MethodInfo(
name="GetEntitlements",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetEntitlementsRequest,
output=authorization_dot_authorization__pb2.GetEntitlementsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=svc.get_entitlements,
),
},
interceptors=interceptors,
read_max_bytes=read_max_bytes,
)

@property
def path(self) -> str:
"""Returns the URL path to mount the application to when serving multiple applications."""
return "/authorization.AuthorizationService"


class AuthorizationServiceClient(ConnectClient):
async def get_decisions(
self,
request: authorization_dot_authorization__pb2.GetDecisionsRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetDecisionsResponse:
return await self.execute_unary(
request=request,
method=MethodInfo(
name="GetDecisions",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsRequest,
output=authorization_dot_authorization__pb2.GetDecisionsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)

async def get_decisions_by_token(
self,
request: authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetDecisionsByTokenResponse:
return await self.execute_unary(
request=request,
method=MethodInfo(
name="GetDecisionsByToken",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
output=authorization_dot_authorization__pb2.GetDecisionsByTokenResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)

async def get_entitlements(
self,
request: authorization_dot_authorization__pb2.GetEntitlementsRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetEntitlementsResponse:
return await self.execute_unary(
request=request,
method=MethodInfo(
name="GetEntitlements",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetEntitlementsRequest,
output=authorization_dot_authorization__pb2.GetEntitlementsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)


class AuthorizationServiceSync(Protocol):
def get_decisions(self, request: authorization_dot_authorization__pb2.GetDecisionsRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetDecisionsResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
def get_decisions_by_token(self, request: authorization_dot_authorization__pb2.GetDecisionsByTokenRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetDecisionsByTokenResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")
def get_entitlements(self, request: authorization_dot_authorization__pb2.GetEntitlementsRequest, ctx: RequestContext) -> authorization_dot_authorization__pb2.GetEntitlementsResponse:
raise ConnectError(Code.UNIMPLEMENTED, "Not implemented")


class AuthorizationServiceWSGIApplication(ConnectWSGIApplication):
def __init__(self, service: AuthorizationServiceSync, interceptors: Iterable[InterceptorSync]=(), read_max_bytes: int | None = None) -> None:
super().__init__(
endpoints={
"/authorization.AuthorizationService/GetDecisions": EndpointSync.unary(
method=MethodInfo(
name="GetDecisions",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsRequest,
output=authorization_dot_authorization__pb2.GetDecisionsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=service.get_decisions,
),
"/authorization.AuthorizationService/GetDecisionsByToken": EndpointSync.unary(
method=MethodInfo(
name="GetDecisionsByToken",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
output=authorization_dot_authorization__pb2.GetDecisionsByTokenResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=service.get_decisions_by_token,
),
"/authorization.AuthorizationService/GetEntitlements": EndpointSync.unary(
method=MethodInfo(
name="GetEntitlements",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetEntitlementsRequest,
output=authorization_dot_authorization__pb2.GetEntitlementsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
function=service.get_entitlements,
),
},
interceptors=interceptors,
read_max_bytes=read_max_bytes,
)

@property
def path(self) -> str:
"""Returns the URL path to mount the application to when serving multiple applications."""
return "/authorization.AuthorizationService"


class AuthorizationServiceClientSync(ConnectClientSync):
def get_decisions(
self,
request: authorization_dot_authorization__pb2.GetDecisionsRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetDecisionsResponse:
return self.execute_unary(
request=request,
method=MethodInfo(
name="GetDecisions",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsRequest,
output=authorization_dot_authorization__pb2.GetDecisionsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)

def get_decisions_by_token(
self,
request: authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetDecisionsByTokenResponse:
return self.execute_unary(
request=request,
method=MethodInfo(
name="GetDecisionsByToken",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetDecisionsByTokenRequest,
output=authorization_dot_authorization__pb2.GetDecisionsByTokenResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)

def get_entitlements(
self,
request: authorization_dot_authorization__pb2.GetEntitlementsRequest,
*,
headers: Headers | Mapping[str, str] | None = None,
timeout_ms: int | None = None,
) -> authorization_dot_authorization__pb2.GetEntitlementsResponse:
return self.execute_unary(
request=request,
method=MethodInfo(
name="GetEntitlements",
service_name="authorization.AuthorizationService",
input=authorization_dot_authorization__pb2.GetEntitlementsRequest,
output=authorization_dot_authorization__pb2.GetEntitlementsResponse,
idempotency_level=IdempotencyLevel.UNKNOWN,
),
headers=headers,
timeout_ms=timeout_ms,
)
Loading
Loading