Skip to content

Commit 35778c3

Browse files
authored
Merge branch 'main' into d-runner
2 parents 7de1ea4 + 0039ea2 commit 35778c3

30 files changed

+241
-686
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ cd cadence-python-client
2626
```bash
2727
# macOS
2828
brew install protobuf@29
29-
29+
3030
# Linux/Other
3131
# Install protobuf 29.x via your package manager
3232
```
@@ -35,7 +35,7 @@ cd cadence-python-client
3535
```bash
3636
# macOS
3737
brew install uv
38-
38+
3939
# Linux/Other
4040
curl -LsSf https://astral.sh/uv/install.sh | sh
4141
source $HOME/.local/bin/env # Add to your shell profile for persistence
@@ -59,6 +59,7 @@ cd cadence-python-client
5959
Run the generation script:
6060
```bash
6161
# Using uv (recommended)
62+
uv sync --extra dev
6263
uv run python scripts/generate_proto.py
6364

6465
# Or using traditional Python

cadence/_internal/decision_state_machine.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from dataclasses import dataclass, field
44
from enum import Enum
5-
from typing import Dict, List, Optional, Callable
5+
from typing import Dict, List, Optional, Callable, TypedDict, Literal
66

77
from cadence.api.v1 import (
88
decision_pb2 as decision,
@@ -81,12 +81,18 @@ def __str__(self) -> str:
8181
@dataclass
8282
class StateTransition:
8383
"""Represents a state transition with associated actions."""
84-
next_state: DecisionState
84+
next_state: Optional[DecisionState]
8585
action: Optional[Callable[['BaseDecisionStateMachine', history.HistoryEvent], None]] = None
8686
condition: Optional[Callable[['BaseDecisionStateMachine', history.HistoryEvent], bool]] = None
8787

8888

89-
decision_state_transition_map = {
89+
class TransitionInfo(TypedDict):
90+
type: Literal["initiated", "started", "completion", "canceled", "cancel_initiated", "cancel_failed", "initiation_failed"]
91+
decision_type: DecisionType
92+
transition: StateTransition
93+
94+
95+
decision_state_transition_map: Dict[str, TransitionInfo] = {
9096
"activity_task_scheduled_event_attributes": {
9197
"type": "initiated",
9298
"decision_type": DecisionType.ACTIVITY,
@@ -247,6 +253,10 @@ class BaseDecisionStateMachine:
247253
Subclasses are responsible for mapping workflow history events into state
248254
transitions and producing the next set of decisions when queried.
249255
"""
256+
257+
# Common fields that subclasses may use
258+
scheduled_event_id: Optional[int] = None
259+
started_event_id: Optional[int] = None
250260

251261
def get_id(self) -> str:
252262
raise NotImplementedError
@@ -890,12 +900,12 @@ def handle_history_event(self, event: history.HistoryEvent) -> None:
890900
if transition_info:
891901
event_type = transition_info["type"]
892902
# Route to all relevant machines using the new unified handle_event method
893-
for m in list(self.activities.values()):
894-
m.handle_event(event, event_type)
895-
for m in list(self.timers.values()):
896-
m.handle_event(event, event_type)
897-
for m in list(self.children.values()):
898-
m.handle_event(event, event_type)
903+
for activity_machine in list(self.activities.values()):
904+
activity_machine.handle_event(event, event_type)
905+
for timer_machine in list(self.timers.values()):
906+
timer_machine.handle_event(event, event_type)
907+
for child_machine in list(self.children.values()):
908+
child_machine.handle_event(event, event_type)
899909

900910
# ----- Decision aggregation -----
901911

@@ -907,11 +917,11 @@ def collect_pending_decisions(self) -> List[decision.Decision]:
907917
decisions.extend(machine.collect_pending_decisions())
908918

909919
# Timers
910-
for machine in list(self.timers.values()):
911-
decisions.extend(machine.collect_pending_decisions())
920+
for timer_machine in list(self.timers.values()):
921+
decisions.extend(timer_machine.collect_pending_decisions())
912922

913923
# Children
914-
for machine in list(self.children.values()):
915-
decisions.extend(machine.collect_pending_decisions())
924+
for child_machine in list(self.children.values()):
925+
decisions.extend(child_machine.collect_pending_decisions())
916926

917927
return decisions

cadence/_internal/rpc/metadata.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import collections
2+
from typing import Any, Callable
23

34
from grpc.aio import Metadata
45
from grpc.aio import UnaryUnaryClientInterceptor, ClientCallDetails
@@ -16,7 +17,12 @@ class MetadataInterceptor(UnaryUnaryClientInterceptor):
1617
def __init__(self, metadata: Metadata):
1718
self._metadata = metadata
1819

19-
async def intercept_unary_unary(self, continuation, client_call_details: ClientCallDetails, request):
20+
async def intercept_unary_unary(
21+
self,
22+
continuation: Callable[[ClientCallDetails, Any], Any],
23+
client_call_details: ClientCallDetails,
24+
request: Any
25+
) -> Any:
2026
return await continuation(self._replace_details(client_call_details), request)
2127

2228

cadence/api/__init__.py

Whitespace-only changes.

cadence/api/v1/__init__.py

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,92 @@
11
# Auto-generated __init__.py file
2-
# Import all generated protobuf and gRPC modules
2+
# Import all generated protobuf modules
33
from . import common_pb2
4-
from . import decision_pb2
5-
from . import domain_pb2
6-
from . import error_pb2
7-
from . import history_pb2
8-
from . import query_pb2
9-
from . import service_domain_pb2
10-
from . import service_meta_pb2
11-
from . import service_visibility_pb2
12-
from . import service_worker_pb2
13-
from . import service_workflow_pb2
14-
from . import tasklist_pb2
15-
from . import visibility_pb2
16-
from . import workflow_pb2
174
from . import common_pb2_grpc
5+
from . import decision_pb2
186
from . import decision_pb2_grpc
7+
from . import domain_pb2
198
from . import domain_pb2_grpc
9+
from . import error_pb2
2010
from . import error_pb2_grpc
11+
from . import history_pb2
2112
from . import history_pb2_grpc
13+
from . import query_pb2
2214
from . import query_pb2_grpc
15+
from . import service_domain_pb2
2316
from . import service_domain_pb2_grpc
17+
from . import service_meta_pb2
2418
from . import service_meta_pb2_grpc
19+
from . import service_visibility_pb2
2520
from . import service_visibility_pb2_grpc
21+
from . import service_worker_pb2
2622
from . import service_worker_pb2_grpc
23+
from . import service_workflow_pb2
2724
from . import service_workflow_pb2_grpc
25+
from . import tasklist_pb2
2826
from . import tasklist_pb2_grpc
27+
from . import visibility_pb2
2928
from . import visibility_pb2_grpc
29+
from . import workflow_pb2
3030
from . import workflow_pb2_grpc
3131

3232
# Create cleaner aliases for easier imports
3333
common = common_pb2
34-
decision = decision_pb2
35-
domain = domain_pb2
36-
error = error_pb2
37-
history = history_pb2
38-
query = query_pb2
39-
service_domain = service_domain_pb2
40-
service_meta = service_meta_pb2
41-
service_visibility = service_visibility_pb2
42-
service_worker = service_worker_pb2
43-
service_workflow = service_workflow_pb2
44-
tasklist = tasklist_pb2
45-
visibility = visibility_pb2
46-
workflow = workflow_pb2
4734
common_grpc = common_pb2_grpc
35+
decision = decision_pb2
4836
decision_grpc = decision_pb2_grpc
37+
domain = domain_pb2
4938
domain_grpc = domain_pb2_grpc
39+
error = error_pb2
5040
error_grpc = error_pb2_grpc
41+
history = history_pb2
5142
history_grpc = history_pb2_grpc
43+
query = query_pb2
5244
query_grpc = query_pb2_grpc
45+
service_domain = service_domain_pb2
5346
service_domain_grpc = service_domain_pb2_grpc
47+
service_meta = service_meta_pb2
5448
service_meta_grpc = service_meta_pb2_grpc
49+
service_visibility = service_visibility_pb2
5550
service_visibility_grpc = service_visibility_pb2_grpc
51+
service_worker = service_worker_pb2
5652
service_worker_grpc = service_worker_pb2_grpc
53+
service_workflow = service_workflow_pb2
5754
service_workflow_grpc = service_workflow_pb2_grpc
55+
tasklist = tasklist_pb2
5856
tasklist_grpc = tasklist_pb2_grpc
57+
visibility = visibility_pb2
5958
visibility_grpc = visibility_pb2_grpc
59+
workflow = workflow_pb2
6060
workflow_grpc = workflow_pb2_grpc
6161

62-
# Only expose clean module names
62+
# Only expose clean module names (no _pb2)
6363
__all__ = [
6464
'common',
65-
'decision',
66-
'domain',
67-
'error',
68-
'history',
69-
'query',
70-
'service_domain',
71-
'service_meta',
72-
'service_visibility',
73-
'service_worker',
74-
'service_workflow',
75-
'tasklist',
76-
'visibility',
77-
'workflow',
7865
'common_grpc',
66+
'decision',
7967
'decision_grpc',
68+
'domain',
8069
'domain_grpc',
70+
'error',
8171
'error_grpc',
72+
'history',
8273
'history_grpc',
74+
'query',
8375
'query_grpc',
76+
'service_domain',
8477
'service_domain_grpc',
78+
'service_meta',
8579
'service_meta_grpc',
80+
'service_visibility',
8681
'service_visibility_grpc',
82+
'service_worker',
8783
'service_worker_grpc',
84+
'service_workflow',
8885
'service_workflow_grpc',
86+
'tasklist',
8987
'tasklist_grpc',
88+
'visibility',
9089
'visibility_grpc',
90+
'workflow',
9191
'workflow_grpc',
9292
]

cadence/api/v1/common_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cadence/api/v1/decision_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cadence/api/v1/domain_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cadence/api/v1/error_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cadence/api/v1/history_pb2.py

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)