Skip to content

Commit defcec5

Browse files
committed
Add flake8 and pytest configuration
1 parent a88594e commit defcec5

File tree

16 files changed

+142
-79
lines changed

16 files changed

+142
-79
lines changed

durabletask/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
"""Durable Task SDK for Python"""
25

3-
PACKAGE_NAME="durabletask"
6+
PACKAGE_NAME = "durabletask"

durabletask/api/state.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
from dataclasses import dataclass
25
from datetime import datetime
36

4-
import durabletask.protos.orchestrator_service_pb2 as pb
57
import durabletask.protos.helpers as helpers
6-
from durabletask.protos.orchestrator_service_pb2 import TaskFailureDetails
8+
import durabletask.protos.orchestrator_service_pb2 as pb
79

810

911
@dataclass

durabletask/api/task_hub_client.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
1-
from dataclasses import dataclass
2-
from datetime import datetime
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
34
import logging
4-
from typing import Any, TypeVar
55
import uuid
6+
from datetime import datetime
7+
from typing import TypeVar
8+
69
import grpc
7-
from durabletask.api.state import OrchestrationState, new_orchestration_state
8-
import durabletask.protos.helpers as helpers
9-
import durabletask.protos.orchestrator_service_pb2 as pb
10-
import durabletask.internal.shared as shared
1110
import simplejson as json
12-
1311
from google.protobuf import wrappers_pb2
1412

13+
import durabletask.internal.shared as shared
14+
import durabletask.protos.helpers as helpers
15+
import durabletask.protos.orchestrator_service_pb2 as pb
1516
import durabletask.task.registry as registry
16-
from durabletask.protos.orchestrator_service_pb2_grpc import TaskHubSidecarServiceStub
17+
from durabletask.api.state import OrchestrationState, new_orchestration_state
18+
from durabletask.protos.orchestrator_service_pb2_grpc import \
19+
TaskHubSidecarServiceStub
1720
from durabletask.task.orchestration import Orchestrator
1821

1922
TInput = TypeVar('TInput')

durabletask/internal/shared.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
import logging
25

36
import grpc
@@ -14,7 +17,9 @@ def get_grpc_channel(host_address: str | None) -> grpc.Channel:
1417
return channel
1518

1619

17-
def get_logger(log_handler: logging.Handler | None = None, log_formatter: logging.Formatter | None = None) -> logging.Logger:
20+
def get_logger(
21+
log_handler: logging.Handler | None = None,
22+
log_formatter: logging.Formatter | None = None) -> logging.Logger:
1823
logger = logging.Logger("durabletask")
1924

2025
# Add a default log handler if none is provided

durabletask/protos/helpers.py

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,107 +1,116 @@
1-
import simplejson as json
2-
import traceback
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
33

4+
import traceback
45
from datetime import datetime
56
from typing import Any
7+
8+
import simplejson as json
69
from google.protobuf import timestamp_pb2, wrappers_pb2
710

8-
from durabletask.protos.orchestrator_service_pb2 import *
11+
import durabletask.protos.orchestrator_service_pb2 as pb
912

1013
# TODO: The new_xxx_event methods are only used by test code and should be moved elsewhere
1114

1215

13-
def new_orchestrator_started_event(timestamp: datetime | None = None) -> HistoryEvent:
16+
def new_orchestrator_started_event(timestamp: datetime | None = None) -> pb.HistoryEvent:
1417
ts = timestamp_pb2.Timestamp()
1518
if timestamp is not None:
1619
ts.FromDatetime(timestamp)
17-
return HistoryEvent(eventId=-1, timestamp=ts, orchestratorStarted=OrchestratorStartedEvent())
20+
return pb.HistoryEvent(eventId=-1, timestamp=ts, orchestratorStarted=pb.OrchestratorStartedEvent())
1821

1922

20-
def new_execution_started_event(name: str, instance_id: str, encoded_input: str | None = None) -> HistoryEvent:
21-
return HistoryEvent(
23+
def new_execution_started_event(name: str, instance_id: str, encoded_input: str | None = None) -> pb.HistoryEvent:
24+
return pb.HistoryEvent(
2225
eventId=-1,
2326
timestamp=timestamp_pb2.Timestamp(),
24-
executionStarted=ExecutionStartedEvent(
25-
name=name, input=get_string_value(encoded_input), orchestrationInstance=OrchestrationInstance(instanceId=instance_id)))
27+
executionStarted=pb.ExecutionStartedEvent(
28+
name=name,
29+
input=get_string_value(encoded_input),
30+
orchestrationInstance=pb.OrchestrationInstance(instanceId=instance_id)))
2631

2732

28-
def new_timer_created_event(timer_id: int, fire_at: datetime) -> HistoryEvent:
33+
def new_timer_created_event(timer_id: int, fire_at: datetime) -> pb.HistoryEvent:
2934
ts = timestamp_pb2.Timestamp()
3035
ts.FromDatetime(fire_at)
31-
return HistoryEvent(
36+
return pb.HistoryEvent(
3237
eventId=timer_id,
3338
timestamp=timestamp_pb2.Timestamp(),
34-
timerCreated=TimerCreatedEvent(fireAt=ts)
39+
timerCreated=pb.TimerCreatedEvent(fireAt=ts)
3540
)
3641

3742

38-
def new_timer_fired_event(timer_id: int, fire_at: datetime) -> HistoryEvent:
43+
def new_timer_fired_event(timer_id: int, fire_at: datetime) -> pb.HistoryEvent:
3944
ts = timestamp_pb2.Timestamp()
4045
ts.FromDatetime(fire_at)
41-
return HistoryEvent(
46+
return pb.HistoryEvent(
4247
eventId=-1,
4348
timestamp=timestamp_pb2.Timestamp(),
44-
timerFired=TimerFiredEvent(fireAt=ts, timerId=timer_id)
49+
timerFired=pb.TimerFiredEvent(fireAt=ts, timerId=timer_id)
4550
)
4651

4752

48-
def new_task_scheduled_event(event_id: int, name: str, encoded_input: str | None = None) -> HistoryEvent:
49-
return HistoryEvent(
53+
def new_task_scheduled_event(event_id: int, name: str, encoded_input: str | None = None) -> pb.HistoryEvent:
54+
return pb.HistoryEvent(
5055
eventId=event_id,
5156
timestamp=timestamp_pb2.Timestamp(),
52-
taskScheduled=TaskScheduledEvent(name=name, input=get_string_value(encoded_input))
57+
taskScheduled=pb.TaskScheduledEvent(name=name, input=get_string_value(encoded_input))
5358
)
5459

5560

56-
def new_task_completed_event(event_id: int, encoded_output: str | None = None) -> HistoryEvent:
57-
return HistoryEvent(
61+
def new_task_completed_event(event_id: int, encoded_output: str | None = None) -> pb.HistoryEvent:
62+
return pb.HistoryEvent(
5863
eventId=-1,
5964
timestamp=timestamp_pb2.Timestamp(),
60-
taskCompleted=TaskCompletedEvent(taskScheduledId=event_id, result=get_string_value(encoded_output))
65+
taskCompleted=pb.TaskCompletedEvent(taskScheduledId=event_id, result=get_string_value(encoded_output))
6166
)
6267

6368

64-
def new_task_failed_event(event_id: int, ex: Exception) -> HistoryEvent:
65-
return HistoryEvent(
69+
def new_task_failed_event(event_id: int, ex: Exception) -> pb.HistoryEvent:
70+
return pb.HistoryEvent(
6671
eventId=-1,
6772
timestamp=timestamp_pb2.Timestamp(),
68-
taskFailed=TaskFailedEvent(taskScheduledId=event_id, failureDetails=new_failure_details(ex))
73+
taskFailed=pb.TaskFailedEvent(taskScheduledId=event_id, failureDetails=new_failure_details(ex))
6974
)
7075

7176

72-
def new_sub_orchestration_created_event(event_id: int, name: str, instance_id: str, encoded_input: str | None = None) -> HistoryEvent:
73-
return HistoryEvent(
77+
def new_sub_orchestration_created_event(
78+
event_id: int,
79+
name: str,
80+
instance_id: str,
81+
encoded_input: str | None = None) -> pb.HistoryEvent:
82+
return pb.HistoryEvent(
7483
eventId=event_id,
7584
timestamp=timestamp_pb2.Timestamp(),
76-
subOrchestrationInstanceCreated=SubOrchestrationInstanceCreatedEvent(
85+
subOrchestrationInstanceCreated=pb.SubOrchestrationInstanceCreatedEvent(
7786
name=name,
7887
input=get_string_value(encoded_input),
7988
instanceId=instance_id)
8089
)
8190

8291

83-
def new_sub_orchestration_completed_event(event_id: int, encoded_output: str | None = None) -> HistoryEvent:
84-
return HistoryEvent(
92+
def new_sub_orchestration_completed_event(event_id: int, encoded_output: str | None = None) -> pb.HistoryEvent:
93+
return pb.HistoryEvent(
8594
eventId=-1,
8695
timestamp=timestamp_pb2.Timestamp(),
87-
subOrchestrationInstanceCompleted=SubOrchestrationInstanceCompletedEvent(
96+
subOrchestrationInstanceCompleted=pb.SubOrchestrationInstanceCompletedEvent(
8897
result=get_string_value(encoded_output),
8998
taskScheduledId=event_id)
9099
)
91100

92101

93-
def new_sub_orchestration_failed_event(event_id: int, ex: Exception) -> HistoryEvent:
94-
return HistoryEvent(
102+
def new_sub_orchestration_failed_event(event_id: int, ex: Exception) -> pb.HistoryEvent:
103+
return pb.HistoryEvent(
95104
eventId=-1,
96105
timestamp=timestamp_pb2.Timestamp(),
97-
subOrchestrationInstanceFailed=SubOrchestrationInstanceFailedEvent(
106+
subOrchestrationInstanceFailed=pb.SubOrchestrationInstanceFailedEvent(
98107
failureDetails=new_failure_details(ex),
99108
taskScheduledId=event_id)
100109
)
101110

102111

103-
def new_failure_details(ex: Exception) -> TaskFailureDetails:
104-
return TaskFailureDetails(
112+
def new_failure_details(ex: Exception) -> pb.TaskFailureDetails:
113+
return pb.TaskFailureDetails(
105114
errorType=type(ex).__name__,
106115
errorMessage=str(ex),
107116
stackTrace=wrappers_pb2.StringValue(value=''.join(traceback.format_tb(ex.__traceback__)))
@@ -117,29 +126,29 @@ def get_string_value(val: str | None) -> wrappers_pb2.StringValue | None:
117126

118127
def new_complete_orchestration_action(
119128
id: int,
120-
status: OrchestrationStatus,
129+
status: pb.OrchestrationStatus,
121130
result: str | None = None,
122-
failure_details: TaskFailureDetails | None = None) -> OrchestratorAction:
131+
failure_details: pb.TaskFailureDetails | None = None) -> pb.OrchestratorAction:
123132

124-
completeOrchestrationAction = CompleteOrchestrationAction(
133+
completeOrchestrationAction = pb.CompleteOrchestrationAction(
125134
orchestrationStatus=status,
126135
result=get_string_value(result),
127136
failureDetails=failure_details)
128137

129138
# TODO: CarryoverEvents
130139

131-
return OrchestratorAction(id=id, completeOrchestration=completeOrchestrationAction)
140+
return pb.OrchestratorAction(id=id, completeOrchestration=completeOrchestrationAction)
132141

133142

134-
def new_create_timer_action(id: int, fire_at: datetime) -> OrchestratorAction:
143+
def new_create_timer_action(id: int, fire_at: datetime) -> pb.OrchestratorAction:
135144
timestamp = timestamp_pb2.Timestamp()
136145
timestamp.FromDatetime(fire_at)
137-
return OrchestratorAction(id=id, createTimer=CreateTimerAction(fireAt=timestamp))
146+
return pb.OrchestratorAction(id=id, createTimer=pb.CreateTimerAction(fireAt=timestamp))
138147

139148

140-
def new_schedule_task_action(id: int, name: str, input: Any) -> OrchestratorAction:
149+
def new_schedule_task_action(id: int, name: str, input: Any) -> pb.OrchestratorAction:
141150
encoded_input = json.dumps(input) if input is not None else None
142-
return OrchestratorAction(id=id, scheduleTask=ScheduleTaskAction(
151+
return pb.OrchestratorAction(id=id, scheduleTask=pb.ScheduleTaskAction(
143152
name=name,
144153
input=get_string_value(encoded_input)
145154
))
@@ -151,9 +160,13 @@ def new_timestamp(dt: datetime) -> timestamp_pb2.Timestamp:
151160
return ts
152161

153162

154-
def new_create_sub_orchestration_action(id: int, name: str, instance_id: str | None, input: Any) -> OrchestratorAction:
163+
def new_create_sub_orchestration_action(
164+
id: int,
165+
name: str,
166+
instance_id: str | None,
167+
input: Any) -> pb.OrchestratorAction:
155168
encoded_input = json.dumps(input) if input is not None else None
156-
return OrchestratorAction(id=id, createSubOrchestration=CreateSubOrchestrationAction(
169+
return pb.OrchestratorAction(id=id, createSubOrchestration=pb.CreateSubOrchestrationAction(
157170
name=name,
158171
instanceId=instance_id,
159172
input=get_string_value(encoded_input)

durabletask/task/activities.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
13

24
from typing import Callable, TypeVar
35

4-
56
TInput = TypeVar('TInput')
67
TOutput = TypeVar('TOutput')
78

durabletask/task/execution.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
from datetime import datetime
25
from logging import Logger
36
from types import GeneratorType
4-
from typing import Any, Dict, Generator, Iterable, List, TypeVar
7+
from typing import Any, Generator, Iterable, List, TypeVar
58

69
import simplejson as json
710

@@ -79,7 +82,7 @@ def set_complete(self, result: Any):
7982
self._is_complete = True
8083
self._result = result
8184
result_json: str | None = None
82-
if result != None:
85+
if result is not None:
8386
result_json = json.dumps(result)
8487
action = ph.new_complete_orchestration_action(
8588
self.next_sequence_number(), pb.ORCHESTRATION_STATUS_COMPLETED, result_json)

durabletask/task/orchestration.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
# See https://peps.python.org/pep-0563/
25
from __future__ import annotations
36

47
from abc import ABC, abstractmethod
58
from datetime import datetime
69
from typing import Any, Callable, Generator, TypeVar
7-
from durabletask.task.activities import Activity
810

911
import durabletask.task.task as task
12+
from durabletask.task.activities import Activity
1013

1114
TInput = TypeVar('TInput')
1215
TOutput = TypeVar('TOutput')
@@ -103,7 +106,7 @@ def call_activity(self, activity: Activity[TInput, TOutput], *,
103106
pass
104107

105108
@abstractmethod
106-
def call_sub_orchestrator(self, orchestrator: Orchestrator[TInput, TOutput], *,
109+
def call_sub_orchestrator(self, orchestrator: Orchestrator[TInput, TOutput], *,
107110
input: TInput | None = None,
108111
instance_id: str | None = None) -> task.Task[TOutput]:
109112
"""Schedule sub-orchestrator function for execution.

durabletask/task/registry.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
from typing import Callable, Dict
2-
from durabletask.task.activities import Activity
35

6+
from durabletask.task.activities import Activity
47
from durabletask.task.orchestration import Orchestrator
58

69

durabletask/task/task.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
14
# See https://peps.python.org/pep-0563/
25
from __future__ import annotations
36

0 commit comments

Comments
 (0)