Skip to content

Commit ea9b41f

Browse files
committed
Add some backwards compatibility for Item objects
1 parent 350153b commit ea9b41f

3 files changed

Lines changed: 103 additions & 6 deletions

File tree

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from dataclasses import dataclass, field
33
from importlib.metadata import entry_points
44
from typing import Any, List, Mapping, Optional, Union
5+
import warnings
56

67
from yamcs.client.core.helpers import to_argument_value
78
from yamcs.protobuf.activities import activities_pb2
89

910
__all__ = [
1011
"Activity",
1112
"CommandActivity",
13+
"ManualActivity",
1214
"ScriptActivity",
1315
"StackActivity",
1416
]
@@ -219,3 +221,15 @@ def _to_proto(self) -> activities_pb2.ActivityDefinitionInfo:
219221
if self.processor:
220222
proto.args["processor"] = self.processor
221223
return proto
224+
225+
226+
@dataclass
227+
class ManualActivity(Activity):
228+
def __post_init__(self):
229+
warnings.warn(
230+
"ManualActivity is deprecated. Instead of using "
231+
"Item(activity=ManualActivity()), use the TimelineTask "
232+
"class.",
233+
category=DeprecationWarning,
234+
stacklevel=3,
235+
)

yamcs-client/src/yamcs/client/timeline/client.py

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import datetime
2-
from typing import Iterable, Optional
2+
from typing import Iterable, Optional, Union
33

44
from yamcs.client.core import pagination
55
from yamcs.client.core.context import Context
66
from yamcs.client.core.helpers import to_isostring, to_server_time
7-
from yamcs.client.timeline.model import Band, TimelineItem, View
7+
from yamcs.client.timeline.model import Band, Item, TimelineItem, View
88
from yamcs.protobuf.timeline import timeline_pb2
99

1010
__all__ = [
@@ -187,13 +187,21 @@ def get_item(self, id: str) -> TimelineItem:
187187
message.ParseFromString(response.content)
188188
return TimelineItem._from_proto(message)
189189

190-
def save_item(self, item: TimelineItem):
190+
def save_item(self, item: Union[TimelineItem, Item]):
191191
"""
192192
Save or update an item.
193193
194-
:param item:
195-
TimelineItem object
194+
:param item: The item to persist.
195+
Note: Support for the 'Item' type is deprecated and
196+
maintained only for migration purposes. Transition
197+
to one of the 'TimelineItem' subclasses
198+
('TimelineEvent', 'TimelineActivity', 'TimelineTask').
196199
"""
200+
201+
# Temp backwards compatibility
202+
if isinstance(item, Item):
203+
item = item._to_timeline_item()
204+
197205
url = f"/timeline/{self._instance}/items/{item.id}"
198206
req = timeline_pb2.SaveItemRequest()
199207

yamcs-client/src/yamcs/client/timeline/model.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import abc
22
import datetime
33
import uuid
4+
import warnings
45
from dataclasses import dataclass
56
from enum import Enum
67
from typing import Any, Dict, List, Optional, Union, cast
78

8-
from yamcs.client.activities import Activity
9+
from yamcs.client.activities import Activity, ManualActivity
910
from yamcs.client.core.helpers import ProtoList, parse_server_time, to_server_time
1011
from yamcs.protobuf.timeline import timeline_pb2
1112

1213
__all__ = [
1314
"Band",
1415
"CommandBand",
1516
"ItemBand",
17+
"Item",
1618
"OnCompletion",
1719
"OnFailure",
1820
"OnStart",
@@ -1394,3 +1396,76 @@ def bands(self, value: List[Band]):
13941396

13951397
def __str__(self):
13961398
return self.name
1399+
1400+
1401+
class Item:
1402+
def __init__(self):
1403+
warnings.warn(
1404+
"Item is deprecated and will be removed in a future version. "
1405+
"Use TimelineEvent, TimelineActivity, or TimelineTask instead.",
1406+
category=DeprecationWarning,
1407+
stacklevel=2,
1408+
)
1409+
1410+
self.name: str = None
1411+
self.tags: List[str] = []
1412+
self.start: datetime.datetime = None
1413+
self.duration: datetime.timedelta = None
1414+
self.activity: Optional[Activity] = None
1415+
self.background_color: Optional[str] = None
1416+
self.border_color: Optional[str] = None
1417+
self.border_width: Optional[int] = None
1418+
self.corner_radius: Optional[int] = None
1419+
self.margin_left: Optional[int] = None
1420+
self.text_color: Optional[str] = None
1421+
self.text_size: Optional[int] = None
1422+
1423+
@property
1424+
def item_type(self) -> str:
1425+
"""Type of item."""
1426+
return timeline_pb2.TimelineItemType.Name(self._proto.type)
1427+
1428+
def _to_timeline_item(self) -> TimelineItem:
1429+
if self.activity:
1430+
if isinstance(self.activity, ManualActivity):
1431+
return self._to_timeline_task()
1432+
else:
1433+
return self._to_timeline_activity()
1434+
else:
1435+
return self._to_timeline_event()
1436+
1437+
def _to_timeline_task(self) -> TimelineTask:
1438+
item = TimelineTask(
1439+
name=self.name,
1440+
start=self.start,
1441+
tags=self.tags,
1442+
duration=self.duration,
1443+
)
1444+
return item
1445+
1446+
def _to_timeline_activity(self) -> TimelineActivity:
1447+
assert self.activity is not None
1448+
item = TimelineActivity(
1449+
name=self.name,
1450+
start=self.start,
1451+
tags=self.tags,
1452+
duration=self.duration,
1453+
activity=self.activity,
1454+
)
1455+
return item
1456+
1457+
def _to_timeline_event(self) -> TimelineEvent:
1458+
item = TimelineEvent(
1459+
name=self.name,
1460+
start=self.start,
1461+
tags=self.tags,
1462+
duration=self.duration,
1463+
background_color=self.background_color,
1464+
border_color=self.border_color,
1465+
border_width=self.border_width,
1466+
corner_radius=self.corner_radius,
1467+
margin_left=self.margin_left,
1468+
text_color=self.text_color,
1469+
text_size=self.text_size,
1470+
)
1471+
return item

0 commit comments

Comments
 (0)