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
6 changes: 5 additions & 1 deletion canvas_generated/messages/plugins_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 12 additions & 1 deletion canvas_generated/messages/plugins_pb2.pyi
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from google.protobuf.internal import containers as _containers
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from typing import ClassVar as _ClassVar, Optional as _Optional
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Optional as _Optional

DESCRIPTOR: _descriptor.FileDescriptor

Expand Down Expand Up @@ -37,3 +38,13 @@ class UnloadPluginResponse(_message.Message):
SUCCESS_FIELD_NUMBER: _ClassVar[int]
success: bool
def __init__(self, success: bool = ...) -> None: ...

class GetRegisteredEventTypesRequest(_message.Message):
__slots__ = ()
def __init__(self) -> None: ...

class GetRegisteredEventTypesResponse(_message.Message):
__slots__ = ("event_types",)
EVENT_TYPES_FIELD_NUMBER: _ClassVar[int]
event_types: _containers.RepeatedScalarFieldContainer[str]
def __init__(self, event_types: _Optional[_Iterable[str]] = ...) -> None: ...
4 changes: 2 additions & 2 deletions canvas_generated/services/plugin_runner_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

33 changes: 33 additions & 0 deletions canvas_generated/services/plugin_runner_pb2_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ def __init__(self, channel):
request_serializer=canvas__generated_dot_messages_dot_plugins__pb2.UnloadPluginRequest.SerializeToString,
response_deserializer=canvas__generated_dot_messages_dot_plugins__pb2.UnloadPluginResponse.FromString,
)
self.GetRegisteredEventTypes = channel.unary_unary(
'/canvas.PluginRunner/GetRegisteredEventTypes',
request_serializer=canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesRequest.SerializeToString,
response_deserializer=canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesResponse.FromString,
)


class PluginRunnerServicer(object):
Expand Down Expand Up @@ -64,6 +69,12 @@ def UnloadPlugin(self, request, context):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def GetRegisteredEventTypes(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')


def add_PluginRunnerServicer_to_server(servicer, server):
rpc_method_handlers = {
Expand All @@ -87,6 +98,11 @@ def add_PluginRunnerServicer_to_server(servicer, server):
request_deserializer=canvas__generated_dot_messages_dot_plugins__pb2.UnloadPluginRequest.FromString,
response_serializer=canvas__generated_dot_messages_dot_plugins__pb2.UnloadPluginResponse.SerializeToString,
),
'GetRegisteredEventTypes': grpc.unary_unary_rpc_method_handler(
servicer.GetRegisteredEventTypes,
request_deserializer=canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesRequest.FromString,
response_serializer=canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'canvas.PluginRunner', rpc_method_handlers)
Expand Down Expand Up @@ -164,3 +180,20 @@ def UnloadPlugin(request,
canvas__generated_dot_messages_dot_plugins__pb2.UnloadPluginResponse.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

@staticmethod
def GetRegisteredEventTypes(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/canvas.PluginRunner/GetRegisteredEventTypes',
canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesRequest.SerializeToString,
canvas__generated_dot_messages_dot_plugins__pb2.GetRegisteredEventTypesResponse.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
8 changes: 8 additions & 0 deletions plugin_runner/plugin_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import settings
from canvas_generated.messages.effects_pb2 import EffectType
from canvas_generated.messages.plugins_pb2 import (
GetRegisteredEventTypesRequest,
GetRegisteredEventTypesResponse,
ReloadPluginRequest,
ReloadPluginResponse,
ReloadPluginsRequest,
Expand Down Expand Up @@ -380,6 +382,12 @@ def UnloadPlugin(
else:
yield UnloadPluginResponse(success=True)

def GetRegisteredEventTypes(
self, request: GetRegisteredEventTypesRequest, context: Any
) -> GetRegisteredEventTypesResponse:
"""Return the event types that have at least one registered handler."""
return GetRegisteredEventTypesResponse(event_types=list(EVENT_HANDLER_MAP.keys()))


STOP_SYNCHRONIZER = threading.Event()

Expand Down
25 changes: 25 additions & 0 deletions plugin_runner/tests/test_plugin_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

from canvas_generated.messages.effects_pb2 import Effect, EffectType
from canvas_generated.messages.plugins_pb2 import (
GetRegisteredEventTypesRequest,
ReloadPluginRequest,
ReloadPluginsRequest,
UnloadPluginRequest,
Expand Down Expand Up @@ -792,3 +793,27 @@ def test_payment_processor(
]

assert result[0].effects == expected_effects


@pytest.mark.parametrize("install_test_plugin", ["example_plugin"], indirect=True)
def test_get_registered_event_types_returns_loaded_event_types(
install_test_plugin: Path,
plugin_runner: PluginRunner,
load_test_plugins: None,
) -> None:
"""Test that GetRegisteredEventTypes returns the event types of loaded plugins."""
response = plugin_runner.GetRegisteredEventTypes(GetRegisteredEventTypesRequest(), None)

assert EventType.Name(EventType.UNKNOWN) in response.event_types


def test_get_registered_event_types_returns_empty_when_no_plugins(
plugin_runner: PluginRunner,
) -> None:
"""Test that GetRegisteredEventTypes returns empty when no plugins are loaded."""
LOADED_PLUGINS.clear()
EVENT_HANDLER_MAP.clear()

response = plugin_runner.GetRegisteredEventTypes(GetRegisteredEventTypesRequest(), None)

assert list(response.event_types) == []
6 changes: 6 additions & 0 deletions protobufs/canvas_generated/messages/plugins.proto
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,10 @@ message UnloadPluginRequest {

message UnloadPluginResponse {
bool success = 1;
}

message GetRegisteredEventTypesRequest {}

message GetRegisteredEventTypesResponse {
repeated string event_types = 1;
}
2 changes: 2 additions & 0 deletions protobufs/canvas_generated/services/plugin_runner.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,6 @@ service PluginRunner {
rpc ReloadPlugin (ReloadPluginRequest) returns (stream ReloadPluginResponse);

rpc UnloadPlugin (UnloadPluginRequest) returns (stream UnloadPluginResponse);

rpc GetRegisteredEventTypes (GetRegisteredEventTypesRequest) returns (GetRegisteredEventTypesResponse);
}
Loading