Skip to content

Commit 2e247f2

Browse files
authored
Merge pull request #68 from tjholm/api-refactor
Refactor APIs to match new generation style in betterproto.
2 parents 11bda8f + 8482b81 commit 2e247f2

23 files changed

+522
-481
lines changed

nitric/api/documents.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@
3232
Key as KeyMessage,
3333
Expression as ExpressionMessage,
3434
ExpressionValue,
35-
Document as DocumentMessage,
35+
Document as DocumentMessage, DocumentSetRequest, DocumentGetRequest, DocumentDeleteRequest,
36+
DocumentQueryStreamRequest, DocumentQueryRequest,
3637
)
3738

3839
from nitric.utils import new_default_channel, _dict_from_struct, _struct_from_dict
@@ -74,7 +75,9 @@ def collection(self, name: str) -> CollectionRef:
7475
async def get(self) -> Document:
7576
"""Retrieve the contents of this document, if it exists."""
7677
try:
77-
response = await self._documents._stub.get(key=_doc_ref_to_wire(self))
78+
response = await self._documents._stub.get(document_get_request=DocumentGetRequest(
79+
key=_doc_ref_to_wire(self)
80+
))
7881
return _document_from_wire(documents=self._documents, message=response.document)
7982
except GRPCError as grpc_err:
8083
raise exception_from_grpc_error(grpc_err)
@@ -87,18 +90,20 @@ async def set(self, content: dict):
8790
"""
8891
try:
8992
await self._documents._stub.set(
90-
key=_doc_ref_to_wire(self),
91-
content=_struct_from_dict(content),
93+
document_set_request=DocumentSetRequest(
94+
key=_doc_ref_to_wire(self),
95+
content=_struct_from_dict(content),
96+
)
9297
)
9398
except GRPCError as grpc_err:
9499
raise exception_from_grpc_error(grpc_err)
95100

96101
async def delete(self):
97102
"""Delete this document, if it exists."""
98103
try:
99-
await self._documents._stub.delete(
104+
await self._documents._stub.delete(document_delete_request=DocumentDeleteRequest(
100105
key=_doc_ref_to_wire(self),
101-
)
106+
))
102107
except GRPCError as grpc_err:
103108
raise exception_from_grpc_error(grpc_err)
104109

@@ -497,9 +502,11 @@ async def stream(self) -> AsyncIterator[Document]:
497502

498503
try:
499504
async for result in self._documents._stub.query_stream(
500-
collection=_collection_to_wire(self._collection),
501-
expressions=self._expressions_to_wire(),
502-
limit=self._limit,
505+
document_query_stream_request=DocumentQueryStreamRequest(
506+
collection=_collection_to_wire(self._collection),
507+
expressions=self._expressions_to_wire(),
508+
limit=self._limit,
509+
)
503510
):
504511
yield _document_from_wire(documents=self._documents, message=result.document)
505512
except GRPCError as grpc_err:
@@ -513,10 +520,12 @@ async def fetch(self) -> QueryResultsPage:
513520
"""
514521
try:
515522
results = await self._documents._stub.query(
516-
collection=_collection_to_wire(self._collection),
517-
expressions=self._expressions_to_wire(),
518-
limit=self._limit,
519-
paging_token=self._paging_token,
523+
document_query_request=DocumentQueryRequest(
524+
collection=_collection_to_wire(self._collection),
525+
expressions=self._expressions_to_wire(),
526+
limit=self._limit,
527+
paging_token=self._paging_token,
528+
)
520529
)
521530

522531
return QueryResultsPage(

nitric/api/events.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424

2525
from nitric.api.exception import exception_from_grpc_error
2626
from nitric.utils import new_default_channel, _struct_from_dict
27-
from nitricapi.nitric.event.v1 import EventServiceStub, NitricEvent, TopicServiceStub
27+
from nitricapi.nitric.event.v1 import EventServiceStub, NitricEvent, TopicServiceStub, EventPublishRequest, \
28+
TopicListRequest
2829
from dataclasses import dataclass, field
2930

3031

@@ -70,7 +71,11 @@ async def publish(
7071
event = Event(**event)
7172

7273
try:
73-
response = await self._events._stub.publish(topic=self.name, event=_event_to_wire(event))
74+
response = await self._events._stub.publish(
75+
event_publish_request=EventPublishRequest(
76+
topic=self.name, event=_event_to_wire(event)
77+
)
78+
)
7479
return Event(**{**event.__dict__.copy(), **{"id": response.id}})
7580
except GRPCError as grpc_err:
7681
raise exception_from_grpc_error(grpc_err)
@@ -97,7 +102,7 @@ def __del__(self):
97102
async def topics(self) -> List[TopicRef]:
98103
"""Get a list of topics available for publishing or subscription."""
99104
try:
100-
response = await self._topic_stub.list()
105+
response = await self._topic_stub.list(topic_list_request=TopicListRequest())
101106
return [self.topic(topic.name) for topic in response.topics]
102107
except GRPCError as grpc_err:
103108
raise exception_from_grpc_error(grpc_err)

nitric/api/queues.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424

2525
from nitric.api.exception import FailedPreconditionException, exception_from_grpc_error, InvalidArgumentException
2626
from nitric.utils import new_default_channel, _struct_from_dict, _dict_from_struct
27-
from nitricapi.nitric.queue.v1 import QueueServiceStub, NitricTask, FailedTask as WireFailedTask
27+
from nitricapi.nitric.queue.v1 import QueueServiceStub, NitricTask, FailedTask as WireFailedTask, QueueCompleteRequest, \
28+
QueueSendRequest, QueueSendBatchRequest, QueueReceiveRequest
2829
from dataclasses import dataclass, field
2930

3031

@@ -59,7 +60,7 @@ async def complete(self):
5960
"Task is missing internal client or lease id, was it returned from " "queue.receive?"
6061
)
6162
try:
62-
await self._queueing._queue_stub.complete(queue=self._queue.name, lease_id=self.lease_id)
63+
await self._queueing._queue_stub.complete(queue_complete_request=QueueCompleteRequest(queue=self._queue.name, lease_id=self.lease_id))
6364
except GRPCError as grpc_err:
6465
raise exception_from_grpc_error(grpc_err)
6566

@@ -149,7 +150,7 @@ async def send(
149150
task = Task(**task)
150151

151152
try:
152-
await self._queueing._queue_stub.send(queue=self.name, task=_task_to_wire(task))
153+
await self._queueing._queue_stub.send(queue_send_request=QueueSendRequest(queue=self.name, task=_task_to_wire(task)))
153154
except GRPCError as grpc_err:
154155
raise exception_from_grpc_error(grpc_err)
155156

@@ -167,7 +168,7 @@ async def _send_batch(self, tasks: List[Union[Task, dict]], raise_on_failure: bo
167168
wire_tasks = [_task_to_wire(Task(**task) if isinstance(task, dict) else task) for task in tasks]
168169

169170
try:
170-
response = await self._queueing._queue_stub.send_batch(queue=self.name, tasks=wire_tasks)
171+
response = await self._queueing._queue_stub.send_batch(queue_send_batch_request=QueueSendBatchRequest(queue=self.name, tasks=wire_tasks))
171172
return [_wire_to_failed_task(failed_task) for failed_task in response.failed_tasks]
172173
except GRPCError as grpc_err:
173174
raise exception_from_grpc_error(grpc_err)
@@ -190,7 +191,7 @@ async def receive(self, limit: int = None) -> List[Task]:
190191
limit = 1
191192

192193
try:
193-
response = await self._queueing._queue_stub.receive(queue=self.name, depth=limit)
194+
response = await self._queueing._queue_stub.receive(queue_receive_request=QueueReceiveRequest(queue=self.name, depth=limit))
194195
# Map the response protobuf response items to Python SDK Nitric Tasks
195196
return [_wire_to_received_task(task=task, queueing=self._queueing, queue=self) for task in response.tasks]
196197
except GRPCError as grpc_err:

nitric/api/secrets.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424

2525
from nitric.api.exception import exception_from_grpc_error
2626
from nitric.utils import new_default_channel
27-
from nitricapi.nitric.secret.v1 import SecretServiceStub, Secret as SecretMessage, SecretVersion as VersionMessage
27+
from nitricapi.nitric.secret.v1 import SecretServiceStub, Secret as SecretMessage, SecretVersion as VersionMessage, \
28+
SecretPutRequest, SecretAccessRequest
2829

2930

3031
class Secrets(object):
@@ -72,7 +73,7 @@ async def put(self, value: Union[str, bytes]) -> SecretVersion:
7273
secret_message = _secret_to_wire(self)
7374

7475
try:
75-
response = await self._secrets._secrets_stub.put(secret=secret_message, value=value)
76+
response = await self._secrets._secrets_stub.put(secret_put_request=SecretPutRequest(secret=secret_message, value=value))
7677
return self.version(version=response.secret_version.version)
7778
except GRPCError as grpc_err:
7879
raise exception_from_grpc_error(grpc_err)
@@ -111,7 +112,7 @@ async def access(self) -> SecretValue:
111112
"""Return the value stored against this version of the secret."""
112113
version_message = _secret_version_to_wire(self)
113114
try:
114-
response = await self._secrets._secrets_stub.access(secret_version=version_message)
115+
response = await self._secrets._secrets_stub.access(secret_access_request=SecretAccessRequest(secret_version=version_message))
115116
except GRPCError as grpc_err:
116117
raise exception_from_grpc_error(grpc_err)
117118

nitric/api/storage.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222

2323
from nitric.api.exception import exception_from_grpc_error, InvalidArgumentException
2424
from nitric.utils import new_default_channel
25-
from nitricapi.nitric.storage.v1 import StorageServiceStub, StoragePreSignUrlRequestOperation
25+
from nitricapi.nitric.storage.v1 import StorageServiceStub, StoragePreSignUrlRequestOperation, StorageWriteRequest, \
26+
StorageReadRequest, StorageDeleteRequest, StoragePreSignUrlRequest
2627
from enum import Enum
2728

2829

@@ -75,7 +76,6 @@ def to_request_operation(self) -> StoragePreSignUrlRequestOperation:
7576
else:
7677
raise InvalidArgumentException("Invalid FileMode")
7778

78-
7979
@dataclass(frozen=True, order=True)
8080
class File(object):
8181
"""A reference to a file in a bucket, used to perform operations on that file."""
@@ -91,30 +91,32 @@ async def write(self, body: bytes):
9191
Will create the file if it doesn't already exist.
9292
"""
9393
try:
94-
await self._storage._storage_stub.write(bucket_name=self._bucket, key=self.key, body=body)
94+
await self._storage._storage_stub.write(storage_write_request=StorageWriteRequest(bucket_name=self._bucket, key=self.key, body=body))
9595
except GRPCError as grpc_err:
9696
raise exception_from_grpc_error(grpc_err)
9797

9898
async def read(self) -> bytes:
9999
"""Read this files contents from the bucket."""
100100
try:
101-
response = await self._storage._storage_stub.read(bucket_name=self._bucket, key=self.key)
101+
response = await self._storage._storage_stub.read(storage_read_request=StorageReadRequest(bucket_name=self._bucket, key=self.key))
102102
return response.body
103103
except GRPCError as grpc_err:
104104
raise exception_from_grpc_error(grpc_err)
105105

106106
async def delete(self):
107107
"""Delete this file from the bucket."""
108108
try:
109-
await self._storage._storage_stub.delete(bucket_name=self._bucket, key=self.key)
109+
await self._storage._storage_stub.delete(storage_delete_request=StorageDeleteRequest(bucket_name=self._bucket, key=self.key))
110110
except GRPCError as grpc_err:
111111
raise exception_from_grpc_error(grpc_err)
112112

113113
async def sign_url(self, mode: FileMode = FileMode.READ, expiry: int = 3600):
114114
"""Generate a signed URL for reading or writing to a file."""
115115
try:
116116
await self._storage._storage_stub.pre_sign_url(
117-
bucket_name=self._bucket, key=self.key, operation=mode.to_request_operation(), expiry=expiry
117+
storage_pre_sign_url_request=StoragePreSignUrlRequest(
118+
bucket_name=self._bucket, key=self.key, operation=mode.to_request_operation(), expiry=expiry
119+
)
118120
)
119121
except GRPCError as grpc_err:
120122
raise exception_from_grpc_error(grpc_err)

nitric/resources/apis.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,11 @@
2828
ApiResource,
2929
ApiScopes,
3030
ApiSecurityDefinition,
31-
ApiSecurityDefinitionJwt
31+
ApiSecurityDefinitionJwt, ResourceDeclareRequest
3232
)
3333
from nitric.utils import new_default_channel
3434
from grpclib import GRPCError
3535
from nitric.api.exception import exception_from_grpc_error
36-
import importlib
37-
3836

3937
class JwtSecurityDefinition:
4038
"""Represents the JWT security definition for an API."""
@@ -85,7 +83,7 @@ def _to_resource(b: Api) -> Resource:
8583
return Resource(name=b.name, type=ResourceType.Api)
8684

8785

88-
def security_definition_to_grpc_declaration(security_definitions: SecurityDefinition) -> ApiSecurityDefinition:
86+
def security_definition_to_grpc_declaration(security_definitions: dict[str,SecurityDefinition]) -> Union[dict[str, ApiSecurityDefinition], None]:
8987
if security_definitions is None or len(security_definitions) == 0:
9088
return None
9189
return {
@@ -132,10 +130,12 @@ def __init__(self, name: str, opts: ApiOptions = None):
132130
async def _register(self):
133131
try:
134132
await self._resources_stub.declare(
135-
resource=_to_resource(self),
136-
api=ApiResource(
137-
security_definitions=security_definition_to_grpc_declaration(self.security_definitions),
138-
security=security_to_grpc_declaration(self.security)
133+
resource_declare_request=ResourceDeclareRequest(
134+
resource=_to_resource(self),
135+
api=ApiResource(
136+
security_definitions=security_definition_to_grpc_declaration(self.security_definitions),
137+
security=security_to_grpc_declaration(self.security)
138+
)
139139
)
140140
)
141141
except GRPCError as grpc_err:

nitric/resources/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import asyncio
2222
from abc import ABC, abstractmethod
23+
from asyncio import Task
2324

2425
from typing import TypeVar, Type, Coroutine, Union
2526

@@ -33,7 +34,7 @@ class BaseResource(ABC):
3334

3435
def __init__(self):
3536
"""Construct a new resource."""
36-
self._reg: Union[Coroutine, None] = None
37+
self._reg: Union[Task, None] = None
3738

3839
@abstractmethod
3940
async def _register(self):
@@ -48,10 +49,9 @@ def make(cls: Type[T], name: str) -> T:
4849
"""
4950
# Todo: store the resource reference in a cache to avoid duplicate registrations
5051
r = cls(name)
51-
r._reg = r._register()
5252
try:
5353
loop = asyncio.get_running_loop()
54-
loop.create_task(r._reg)
54+
r._reg = loop.create_task(r._register())
5555
except RuntimeError:
5656
loop = asyncio.get_event_loop()
5757
loop.run_until_complete(r._reg)

nitric/resources/buckets.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
ResourceServiceStub,
3434
PolicyResource,
3535
ResourceType,
36-
Action,
36+
Action, ResourceDeclareRequest,
3737
)
3838

3939
from nitric.resources.base import BaseResource
@@ -80,23 +80,23 @@ def __init__(self, name: str):
8080

8181
async def _register(self):
8282
try:
83-
await self._resources_stub.declare(resource=_to_resource(self))
83+
await self._resources_stub.declare(resource_declare_request=ResourceDeclareRequest(resource=_to_resource(self)))
8484
except GRPCError as grpc_err:
8585
raise exception_from_grpc_error(grpc_err)
8686

8787
async def allow(self, permissions: List[str]) -> BucketRef:
8888
"""Request the required permissions for this resource."""
8989
# Ensure registration of the resource is complete before requesting permissions.
9090
if self._reg is not None:
91-
await asyncio.wait({self._reg})
91+
await self._reg
9292

9393
policy = PolicyResource(
9494
principals=[Resource(type=ResourceType.Function)],
9595
actions=_perms_to_actions(permissions),
9696
resources=[_to_resource(self)],
9797
)
9898
try:
99-
await self._resources_stub.declare(policy=policy)
99+
await self._resources_stub.declare(resource_declare_request=ResourceDeclareRequest(resource=Resource(type=ResourceType.Policy), policy=policy))
100100
except GRPCError as grpc_err:
101101
raise exception_from_grpc_error(grpc_err)
102102

nitric/resources/collections.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
ResourceServiceStub,
3434
PolicyResource,
3535
ResourceType,
36-
Action,
36+
Action, ResourceDeclareRequest,
3737
)
3838

3939
from nitric.resources.base import BaseResource
@@ -71,29 +71,30 @@ class Collection(BaseResource):
7171

7272
def __init__(self, name: str):
7373
"""Construct a new document collection."""
74+
super().__init__()
7475
self.name = name
7576
self._channel = new_default_channel()
7677
self._resources_stub = ResourceServiceStub(channel=self._channel)
7778

7879
async def _register(self):
7980
try:
80-
await self._resources_stub.declare(resource=_to_resource(self))
81+
await self._resources_stub.declare(resource_declare_request=ResourceDeclareRequest(resource=_to_resource(self)))
8182
except GRPCError as grpc_err:
8283
raise exception_from_grpc_error(grpc_err)
8384

8485
async def allow(self, permissions: List[Union[CollectionPermission, str]]) -> CollectionRef:
8586
"""Request the required permissions for this collection."""
8687
# Ensure registration of the resource is complete before requesting permissions.
8788
if self._reg is not None:
88-
await asyncio.wait({self._reg})
89+
await self._reg
8990

9091
policy = PolicyResource(
9192
principals=[Resource(type=ResourceType.Function)],
9293
actions=_perms_to_actions(permissions),
9394
resources=[_to_resource(self)],
9495
)
9596
try:
96-
await self._resources_stub.declare(policy=policy)
97+
await self._resources_stub.declare(resource_declare_request=ResourceDeclareRequest(resource=Resource(type=ResourceType.Policy), policy=policy))
9798
except GRPCError as grpc_err:
9899
raise exception_from_grpc_error(grpc_err)
99100

0 commit comments

Comments
 (0)