Skip to content

Commit e55a700

Browse files
Bernd VerstCopilot
andcommitted
Modernize typing to Python 3.10+ idioms
The repository declares `requires-python = ">=3.10"` but its hand-written modules still relied on pre-3.10 typing constructs. Apply PEP 604, PEP 585, PEP 613, and PEP 634 throughout, leaving generated proto/grpc files and their hand-written stub mirror untouched. - Replace `Optional[X]` with `X | None` and `Union[X, Y]` with `X | Y` (PEP 604). - Replace `List[...]` / `Dict[...]` / `Tuple[...]` / `Type[...]` with the built-in generic forms `list[...]`, `dict[...]`, `tuple[...]`, `type[...]` (PEP 585). - Annotate module-level type aliases in `durabletask/task.py` and `durabletask/internal/shared.py` with `TypeAlias` (PEP 613). - Convert the `action_type` dispatch in `_get_method_name_for_action` to `match`/`case` (PEP 634). - Drop now-unused `typing` imports. No public API or behavior changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 5758091 commit e55a700

29 files changed

Lines changed: 577 additions & 580 deletions

durabletask-azuremanaged/durabletask/azuremanaged/client.py

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
# Licensed under the MIT License.
33

44
import logging
5-
6-
from typing import Optional, Sequence
5+
from collections.abc import Sequence
76

87
import grpc
98
import grpc.aio
@@ -28,16 +27,16 @@ class DurableTaskSchedulerClient(TaskHubGrpcClient):
2827
def __init__(self, *,
2928
host_address: str,
3029
taskhub: str,
31-
token_credential: Optional[TokenCredential],
32-
channel: Optional[grpc.Channel] = None,
30+
token_credential: TokenCredential | None,
31+
channel: grpc.Channel | None = None,
3332
secure_channel: bool = True,
34-
interceptors: Optional[Sequence[shared.ClientInterceptor]] = None,
35-
channel_options: Optional[GrpcChannelOptions] = None,
36-
resiliency_options: Optional[GrpcClientResiliencyOptions] = None,
37-
default_version: Optional[str] = None,
38-
payload_store: Optional[PayloadStore] = None,
39-
log_handler: Optional[logging.Handler] = None,
40-
log_formatter: Optional[logging.Formatter] = None):
33+
interceptors: Sequence[shared.ClientInterceptor] | None = None,
34+
channel_options: GrpcChannelOptions | None = None,
35+
resiliency_options: GrpcClientResiliencyOptions | None = None,
36+
default_version: str | None = None,
37+
payload_store: PayloadStore | None = None,
38+
log_handler: logging.Handler | None = None,
39+
log_formatter: logging.Formatter | None = None):
4140

4241
if not taskhub:
4342
raise ValueError("Taskhub value cannot be empty. Please provide a value for your taskhub")
@@ -75,17 +74,17 @@ class AsyncDurableTaskSchedulerClient(AsyncTaskHubGrpcClient):
7574
Args:
7675
host_address (str): The gRPC endpoint address of the DTS service.
7776
taskhub (str): The name of the task hub. Cannot be empty.
78-
token_credential (Optional[TokenCredential]): Azure credential for authentication.
77+
token_credential (TokenCredential | None): Azure credential for authentication.
7978
If None, anonymous authentication will be used.
8079
secure_channel (bool, optional): Whether to use a secure gRPC channel (TLS).
8180
Defaults to True.
82-
resiliency_options (Optional[GrpcClientResiliencyOptions], optional): Client-side
81+
resiliency_options (GrpcClientResiliencyOptions | None, optional): Client-side
8382
gRPC resiliency settings forwarded to the base async client.
84-
default_version (Optional[str], optional): Default version string for orchestrations.
85-
payload_store (Optional[PayloadStore], optional): A payload store for
83+
default_version (str | None, optional): Default version string for orchestrations.
84+
payload_store (PayloadStore | None, optional): A payload store for
8685
externalizing large payloads. If None, payloads are sent inline.
87-
log_handler (Optional[logging.Handler], optional): Custom logging handler for client logs.
88-
log_formatter (Optional[logging.Formatter], optional): Custom log formatter for client logs.
86+
log_handler (logging.Handler | None, optional): Custom logging handler for client logs.
87+
log_formatter (logging.Formatter | None, optional): Custom log formatter for client logs.
8988
9089
Raises:
9190
ValueError: If taskhub is empty or None.
@@ -106,16 +105,16 @@ class AsyncDurableTaskSchedulerClient(AsyncTaskHubGrpcClient):
106105
def __init__(self, *,
107106
host_address: str,
108107
taskhub: str,
109-
token_credential: Optional[AsyncTokenCredential],
110-
channel: Optional[grpc.aio.Channel] = None,
108+
token_credential: AsyncTokenCredential | None,
109+
channel: grpc.aio.Channel | None = None,
111110
secure_channel: bool = True,
112-
interceptors: Optional[Sequence[shared.AsyncClientInterceptor]] = None,
113-
channel_options: Optional[GrpcChannelOptions] = None,
114-
resiliency_options: Optional[GrpcClientResiliencyOptions] = None,
115-
default_version: Optional[str] = None,
116-
payload_store: Optional[PayloadStore] = None,
117-
log_handler: Optional[logging.Handler] = None,
118-
log_formatter: Optional[logging.Formatter] = None):
111+
interceptors: Sequence[shared.AsyncClientInterceptor] | None = None,
112+
channel_options: GrpcChannelOptions | None = None,
113+
resiliency_options: GrpcClientResiliencyOptions | None = None,
114+
default_version: str | None = None,
115+
payload_store: PayloadStore | None = None,
116+
log_handler: logging.Handler | None = None,
117+
log_formatter: logging.Formatter | None = None):
119118

120119
if not taskhub:
121120
raise ValueError("Taskhub value cannot be empty. Please provide a value for your taskhub")

durabletask-azuremanaged/durabletask/azuremanaged/internal/access_token_manager.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Licensed under the MIT License.
33
from datetime import datetime, timedelta, timezone
44
from threading import Lock
5-
from typing import Optional
65

76
from azure.core.credentials import AccessToken, TokenCredential
87
from azure.core.credentials_async import AsyncTokenCredential
@@ -13,9 +12,9 @@
1312
# By default, when there's 10minutes left before the token expires, refresh the token
1413
class AccessTokenManager:
1514

16-
_token: Optional[AccessToken]
15+
_token: AccessToken | None
1716

18-
def __init__(self, token_credential: Optional[TokenCredential], refresh_interval_seconds: int = 600):
17+
def __init__(self, token_credential: TokenCredential | None, refresh_interval_seconds: int = 600):
1918
self._scope = "https://durabletask.io/.default"
2019
self._refresh_interval_seconds = refresh_interval_seconds
2120
self._logger = shared.get_logger("token_manager")
@@ -30,7 +29,7 @@ def __init__(self, token_credential: Optional[TokenCredential], refresh_interval
3029
self._token = None
3130
self.expiry_time = None
3231

33-
def get_access_token(self) -> Optional[AccessToken]:
32+
def get_access_token(self) -> AccessToken | None:
3433
if self._token is None or self.is_token_expired():
3534
with self._refresh_lock:
3635
if self._token is None or self.is_token_expired():
@@ -59,9 +58,9 @@ class AsyncAccessTokenManager:
5958
6059
This avoids blocking the event loop when acquiring or refreshing tokens."""
6160

62-
_token: Optional[AccessToken]
61+
_token: AccessToken | None
6362

64-
def __init__(self, token_credential: Optional[AsyncTokenCredential],
63+
def __init__(self, token_credential: AsyncTokenCredential | None,
6564
refresh_interval_seconds: int = 600):
6665
self._scope = "https://durabletask.io/.default"
6766
self._refresh_interval_seconds = refresh_interval_seconds
@@ -71,7 +70,7 @@ def __init__(self, token_credential: Optional[AsyncTokenCredential],
7170
self._token = None
7271
self.expiry_time = None
7372

74-
async def get_access_token(self) -> Optional[AccessToken]:
73+
async def get_access_token(self) -> AccessToken | None:
7574
if self._token is None or self.is_token_expired():
7675
await self.refresh_token()
7776
return self._token

durabletask-azuremanaged/durabletask/azuremanaged/internal/durabletask_grpc_interceptor.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Licensed under the MIT License.
33

44
from importlib.metadata import version
5-
from typing import Optional
65

76
import grpc
87
from azure.core.credentials import TokenCredential
@@ -27,9 +26,9 @@ class DTSDefaultClientInterceptorImpl (DefaultClientInterceptorImpl):
2726

2827
def __init__(
2928
self,
30-
token_credential: Optional[TokenCredential],
29+
token_credential: TokenCredential | None,
3130
taskhub_name: str,
32-
worker_id: Optional[str] = None):
31+
worker_id: str | None = None):
3332
try:
3433
# Get the version of the azuremanaged package
3534
sdk_version = version('durabletask-azuremanaged')
@@ -83,7 +82,7 @@ class DTSAsyncDefaultClientInterceptorImpl(DefaultAsyncClientInterceptorImpl):
8382
This class implements async gRPC interceptors to add DTS-specific headers
8483
(task hub name, user agent, and authentication token) to all async calls."""
8584

86-
def __init__(self, token_credential: Optional[AsyncTokenCredential], taskhub_name: str):
85+
def __init__(self, token_credential: AsyncTokenCredential | None, taskhub_name: str):
8786
try:
8887
# Get the version of the azuremanaged package
8988
sdk_version = version('durabletask-azuremanaged')

durabletask-azuremanaged/durabletask/azuremanaged/worker.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
import os
66
import socket
77
import uuid
8-
9-
from typing import Optional, Sequence
8+
from collections.abc import Sequence
109

1110
import grpc
1211
from azure.core.credentials import TokenCredential
@@ -33,19 +32,19 @@ class DurableTaskSchedulerWorker(TaskHubGrpcWorker):
3332
Args:
3433
host_address (str): The gRPC endpoint address of the DTS service.
3534
taskhub (str): The name of the task hub. Cannot be empty.
36-
token_credential (Optional[TokenCredential]): Azure credential for authentication.
35+
token_credential (TokenCredential | None): Azure credential for authentication.
3736
If None, anonymous authentication will be used.
3837
secure_channel (bool, optional): Whether to use a secure gRPC channel (TLS).
3938
Defaults to True.
40-
resiliency_options (Optional[GrpcWorkerResiliencyOptions], optional): Worker-side
39+
resiliency_options (GrpcWorkerResiliencyOptions | None, optional): Worker-side
4140
gRPC resiliency settings forwarded to the base worker.
42-
concurrency_options (Optional[ConcurrencyOptions], optional): Configuration
41+
concurrency_options (ConcurrencyOptions | None, optional): Configuration
4342
for controlling worker concurrency limits. If None, default concurrency
4443
settings will be used.
45-
payload_store (Optional[PayloadStore], optional): A payload store for
44+
payload_store (PayloadStore | None, optional): A payload store for
4645
externalizing large payloads. If None, payloads are sent inline.
47-
log_handler (Optional[logging.Handler], optional): Custom logging handler for worker logs.
48-
log_formatter (Optional[logging.Formatter], optional): Custom log formatter for worker logs.
46+
log_handler (logging.Handler | None, optional): Custom logging handler for worker logs.
47+
log_formatter (logging.Formatter | None, optional): Custom log formatter for worker logs.
4948
5049
Raises:
5150
ValueError: If taskhub is empty or None.
@@ -74,16 +73,16 @@ class DurableTaskSchedulerWorker(TaskHubGrpcWorker):
7473
def __init__(self, *,
7574
host_address: str,
7675
taskhub: str,
77-
token_credential: Optional[TokenCredential],
78-
channel: Optional[grpc.Channel] = None,
76+
token_credential: TokenCredential | None,
77+
channel: grpc.Channel | None = None,
7978
secure_channel: bool = True,
80-
interceptors: Optional[Sequence[shared.ClientInterceptor]] = None,
81-
channel_options: Optional[GrpcChannelOptions] = None,
82-
resiliency_options: Optional[GrpcWorkerResiliencyOptions] = None,
83-
concurrency_options: Optional[ConcurrencyOptions] = None,
84-
payload_store: Optional[PayloadStore] = None,
85-
log_handler: Optional[logging.Handler] = None,
86-
log_formatter: Optional[logging.Formatter] = None):
79+
interceptors: Sequence[shared.ClientInterceptor] | None = None,
80+
channel_options: GrpcChannelOptions | None = None,
81+
resiliency_options: GrpcWorkerResiliencyOptions | None = None,
82+
concurrency_options: ConcurrencyOptions | None = None,
83+
payload_store: PayloadStore | None = None,
84+
log_handler: logging.Handler | None = None,
85+
log_formatter: logging.Formatter | None = None):
8786

8887
if not taskhub:
8988
raise ValueError("The taskhub value cannot be empty.")

0 commit comments

Comments
 (0)