Skip to content

Commit 295168e

Browse files
committed
Discover non-core activities
1 parent abab164 commit 295168e

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

pyrightconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
"ignore": [
33
"**/*_pb2.py"
44
],
5-
"reportAttributeAccessIssue": false
5+
"reportAttributeAccessIssue": false,
6+
"reportInvalidTypeForm": "none"
67
}

yamcs-client/src/yamcs/client/activities.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import abc
12
from dataclasses import dataclass, field
23
from typing import Any, List, Mapping, Optional, Union
34

5+
import pkg_resources
46
from yamcs.client.core.helpers import to_argument_value
57
from yamcs.protobuf.activities import activities_pb2
68

@@ -16,14 +18,23 @@
1618
@dataclass
1719
class Activity:
1820
"""
19-
Superclass for activities. Implementations:
21+
Superclass for activities. Core implementations:
2022
2123
* :class:`.CommandActivity`
2224
* :class:`.CommandStackActivity`
2325
* :class:`.ManualActivity`
2426
* :class:`.ScriptActivity`
2527
"""
2628

29+
@staticmethod
30+
@abc.abstractmethod
31+
def _from_proto(proto: activities_pb2.ActivityDefinitionInfo) -> "Activity":
32+
pass
33+
34+
@abc.abstractmethod
35+
def _to_proto(self) -> activities_pb2.ActivityDefinitionInfo:
36+
pass
37+
2738
@staticmethod
2839
def _as_subclass(proto):
2940
# No need for MANUAL.
@@ -36,7 +47,14 @@ def _as_subclass(proto):
3647
elif proto.type == "SCRIPT":
3748
return ScriptActivity._from_proto(proto)
3849
else:
39-
raise ValueError("Unexpected activity type")
50+
for entry in pkg_resources.iter_entry_points(
51+
group="yamcs.client.activities"
52+
):
53+
if proto.type == entry.name:
54+
activity_cls = entry.load()
55+
return activity_cls._from_proto(proto)
56+
57+
raise ValueError(f"Unexpected activity type: {proto.type}")
4058

4159

4260
@dataclass

0 commit comments

Comments
 (0)