Skip to content

Commit 88cdef6

Browse files
committed
Merge branch 'main' into bundled-optional-exts
Signed-off-by: Sergio Herrera <627709+seherv@users.noreply.github.com>
2 parents c47d702 + ad59aa8 commit 88cdef6

27 files changed

Lines changed: 1812 additions & 547 deletions

dapr/aio/clients/grpc/client.py

Lines changed: 81 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,10 +1738,11 @@ async def get_metadata(self) -> GetMetadataResponse:
17381738
mcp_servers=mcp_servers,
17391739
)
17401740

1741-
async def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprResponse:
1741+
async def schedule_job(self, job: Job, overwrite: bool = False) -> DaprResponse:
17421742
"""Schedules a job to be triggered at a specified time or interval.
17431743
1744-
This is an Alpha API and is subject to change.
1744+
Calls the stable ScheduleJob RPC and falls back to ScheduleJobAlpha1 when
1745+
the sidecar predates the stable Jobs API.
17451746
17461747
Args:
17471748
job (Job): The job to schedule. Must have a name and either schedule or due_time.
@@ -1754,32 +1755,46 @@ async def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprRe
17541755
ValueError: If job name is empty or both schedule and due_time are missing.
17551756
DaprGrpcError: If the Dapr runtime returns an error.
17561757
"""
1757-
# Warnings and input validation
1758-
warn(
1759-
'The Jobs API is an Alpha version and is subject to change.',
1760-
UserWarning,
1761-
stacklevel=2,
1762-
)
17631758
validateNotBlankString(job_name=job.name)
17641759

17651760
if not job.schedule and not job.due_time:
17661761
raise ValueError('Job must have either schedule or due_time specified')
17671762

1768-
# Convert job to proto using the Job class private method
17691763
job_proto = job._get_proto()
17701764
request = api_v1.ScheduleJobRequest(job=job_proto, overwrite=overwrite)
17711765

17721766
try:
1773-
call = self._stub.ScheduleJobAlpha1(request)
1767+
call = self._stub.ScheduleJob(request)
17741768
await call
1775-
return DaprResponse(headers=await call.initial_metadata())
1776-
except grpc.aio.AioRpcError as err:
1777-
raise DaprGrpcError(err) from err
1769+
except AioRpcError as err:
1770+
if err.code() == StatusCode.UNIMPLEMENTED:
1771+
try:
1772+
call = self._stub.ScheduleJobAlpha1(request)
1773+
await call
1774+
except AioRpcError as err2:
1775+
raise DaprGrpcError(err2) from err2
1776+
else:
1777+
raise DaprGrpcError(err) from err
1778+
return DaprResponse(headers=await call.initial_metadata())
17781779

1779-
async def get_job_alpha1(self, name: str) -> Job:
1780+
async def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprResponse:
1781+
"""Deprecated: use :meth:`schedule_job`.
1782+
1783+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1784+
for backwards compatibility and forwards to :meth:`schedule_job`.
1785+
"""
1786+
warn(
1787+
'schedule_job_alpha1 is deprecated; use schedule_job instead.',
1788+
DeprecationWarning,
1789+
stacklevel=2,
1790+
)
1791+
return await self.schedule_job(job, overwrite)
1792+
1793+
async def get_job(self, name: str) -> Job:
17801794
"""Gets a scheduled job by name.
17811795
1782-
This is an Alpha API and is subject to change.
1796+
Calls the stable GetJob RPC and falls back to GetJobAlpha1 when the
1797+
sidecar predates the stable Jobs API.
17831798
17841799
Args:
17851800
name (str): The name of the job to retrieve.
@@ -1791,27 +1806,42 @@ async def get_job_alpha1(self, name: str) -> Job:
17911806
ValueError: If job name is empty.
17921807
DaprGrpcError: If the Dapr runtime returns an error.
17931808
"""
1794-
# Warnings and input validation
1795-
warn(
1796-
'The Jobs API is an Alpha version and is subject to change.',
1797-
UserWarning,
1798-
stacklevel=2,
1799-
)
18001809
validateNotBlankString(job_name=name)
18011810

18021811
request = api_v1.GetJobRequest(name=name)
18031812

18041813
try:
1805-
call = self._stub.GetJobAlpha1(request)
1814+
call = self._stub.GetJob(request)
18061815
response = await call
1807-
return Job._from_proto(response.job)
1808-
except grpc.aio.AioRpcError as err:
1809-
raise DaprGrpcError(err) from err
1816+
except AioRpcError as err:
1817+
if err.code() == StatusCode.UNIMPLEMENTED:
1818+
try:
1819+
call = self._stub.GetJobAlpha1(request)
1820+
response = await call
1821+
except AioRpcError as err2:
1822+
raise DaprGrpcError(err2) from err2
1823+
else:
1824+
raise DaprGrpcError(err) from err
1825+
return Job._from_proto(response.job)
18101826

1811-
async def delete_job_alpha1(self, name: str) -> DaprResponse:
1827+
async def get_job_alpha1(self, name: str) -> Job:
1828+
"""Deprecated: use :meth:`get_job`.
1829+
1830+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1831+
for backwards compatibility and forwards to :meth:`get_job`.
1832+
"""
1833+
warn(
1834+
'get_job_alpha1 is deprecated; use get_job instead.',
1835+
DeprecationWarning,
1836+
stacklevel=2,
1837+
)
1838+
return await self.get_job(name)
1839+
1840+
async def delete_job(self, name: str) -> DaprResponse:
18121841
"""Deletes a scheduled job by name.
18131842
1814-
This is an Alpha API and is subject to change.
1843+
Calls the stable DeleteJob RPC and falls back to DeleteJobAlpha1 when the
1844+
sidecar predates the stable Jobs API.
18151845
18161846
Args:
18171847
name (str): The name of the job to delete.
@@ -1823,22 +1853,36 @@ async def delete_job_alpha1(self, name: str) -> DaprResponse:
18231853
ValueError: If job name is empty.
18241854
DaprGrpcError: If the Dapr runtime returns an error.
18251855
"""
1826-
# Warnings and input validation
1827-
warn(
1828-
'The Jobs API is an Alpha version and is subject to change.',
1829-
UserWarning,
1830-
stacklevel=2,
1831-
)
18321856
validateNotBlankString(job_name=name)
18331857

18341858
request = api_v1.DeleteJobRequest(name=name)
18351859

18361860
try:
1837-
call = self._stub.DeleteJobAlpha1(request)
1861+
call = self._stub.DeleteJob(request)
18381862
await call
1839-
return DaprResponse(headers=await call.initial_metadata())
1840-
except grpc.aio.AioRpcError as err:
1841-
raise DaprGrpcError(err) from err
1863+
except AioRpcError as err:
1864+
if err.code() == StatusCode.UNIMPLEMENTED:
1865+
try:
1866+
call = self._stub.DeleteJobAlpha1(request)
1867+
await call
1868+
except AioRpcError as err2:
1869+
raise DaprGrpcError(err2) from err2
1870+
else:
1871+
raise DaprGrpcError(err) from err
1872+
return DaprResponse(headers=await call.initial_metadata())
1873+
1874+
async def delete_job_alpha1(self, name: str) -> DaprResponse:
1875+
"""Deprecated: use :meth:`delete_job`.
1876+
1877+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1878+
for backwards compatibility and forwards to :meth:`delete_job`.
1879+
"""
1880+
warn(
1881+
'delete_job_alpha1 is deprecated; use delete_job instead.',
1882+
DeprecationWarning,
1883+
stacklevel=2,
1884+
)
1885+
return await self.delete_job(name)
18421886

18431887
async def set_metadata(self, attributeName: str, attributeValue: str) -> DaprResponse:
18441888
"""Adds a custom (extended) metadata attribute to the Dapr sidecar

dapr/clients/grpc/client.py

Lines changed: 81 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,10 +1668,11 @@ def converse_alpha2(
16681668
except RpcError as err:
16691669
raise DaprGrpcError(err) from err
16701670

1671-
def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprResponse:
1671+
def schedule_job(self, job: Job, overwrite: bool = False) -> DaprResponse:
16721672
"""Schedules a job to be triggered at a specified time or interval.
16731673
1674-
This is an Alpha API and is subject to change.
1674+
Calls the stable ScheduleJob RPC and falls back to ScheduleJobAlpha1 when
1675+
the sidecar predates the stable Jobs API.
16751676
16761677
Args:
16771678
job (Job): The job to schedule. Must have a name and either schedule or due_time.
@@ -1684,31 +1685,46 @@ def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprResponse
16841685
ValueError: If job name is empty or both schedule and due_time are missing.
16851686
DaprGrpcError: If the Dapr runtime returns an error.
16861687
"""
1687-
# Warnings and input validation
1688-
warn(
1689-
'The Jobs API is an Alpha version and is subject to change.',
1690-
UserWarning,
1691-
stacklevel=2,
1692-
)
16931688
validateNotBlankString(job_name=job.name)
16941689

16951690
if not job.schedule and not job.due_time:
16961691
raise ValueError('Job must have either schedule or due_time specified')
16971692

1698-
# Convert job to proto using the Job class private method
16991693
job_proto = job._get_proto()
17001694
request = api_v1.ScheduleJobRequest(job=job_proto, overwrite=overwrite)
17011695

17021696
try:
1703-
_, call = self.retry_policy.run_rpc(self._stub.ScheduleJobAlpha1.with_call, request)
1704-
return DaprResponse(headers=call.initial_metadata())
1697+
_, call = self.retry_policy.run_rpc(self._stub.ScheduleJob.with_call, request)
17051698
except RpcError as err:
1706-
raise DaprGrpcError(err) from err
1699+
if err.code() == StatusCode.UNIMPLEMENTED:
1700+
try:
1701+
_, call = self.retry_policy.run_rpc(
1702+
self._stub.ScheduleJobAlpha1.with_call, request
1703+
)
1704+
except RpcError as err2:
1705+
raise DaprGrpcError(err2) from err2
1706+
else:
1707+
raise DaprGrpcError(err) from err
1708+
return DaprResponse(headers=call.initial_metadata())
17071709

1708-
def get_job_alpha1(self, name: str) -> Job:
1710+
def schedule_job_alpha1(self, job: Job, overwrite: bool = False) -> DaprResponse:
1711+
"""Deprecated: use :meth:`schedule_job`.
1712+
1713+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1714+
for backwards compatibility and forwards to :meth:`schedule_job`.
1715+
"""
1716+
warn(
1717+
'schedule_job_alpha1 is deprecated; use schedule_job instead.',
1718+
DeprecationWarning,
1719+
stacklevel=2,
1720+
)
1721+
return self.schedule_job(job, overwrite)
1722+
1723+
def get_job(self, name: str) -> Job:
17091724
"""Gets a scheduled job by name.
17101725
1711-
This is an Alpha API and is subject to change.
1726+
Calls the stable GetJob RPC and falls back to GetJobAlpha1 when the
1727+
sidecar predates the stable Jobs API.
17121728
17131729
Args:
17141730
name (str): The name of the job to retrieve.
@@ -1720,26 +1736,42 @@ def get_job_alpha1(self, name: str) -> Job:
17201736
ValueError: If job name is empty.
17211737
DaprGrpcError: If the Dapr runtime returns an error.
17221738
"""
1723-
# Warnings and input validation
1724-
warn(
1725-
'The Jobs API is an Alpha version and is subject to change.',
1726-
UserWarning,
1727-
stacklevel=2,
1728-
)
17291739
validateNotBlankString(job_name=name)
17301740

17311741
request = api_v1.GetJobRequest(name=name)
17321742

17331743
try:
1734-
response, call = self.retry_policy.run_rpc(self._stub.GetJobAlpha1.with_call, request)
1735-
return Job._from_proto(response.job)
1744+
response, _ = self.retry_policy.run_rpc(self._stub.GetJob.with_call, request)
17361745
except RpcError as err:
1737-
raise DaprGrpcError(err) from err
1746+
if err.code() == StatusCode.UNIMPLEMENTED:
1747+
try:
1748+
response, _ = self.retry_policy.run_rpc(
1749+
self._stub.GetJobAlpha1.with_call, request
1750+
)
1751+
except RpcError as err2:
1752+
raise DaprGrpcError(err2) from err2
1753+
else:
1754+
raise DaprGrpcError(err) from err
1755+
return Job._from_proto(response.job)
17381756

1739-
def delete_job_alpha1(self, name: str) -> DaprResponse:
1757+
def get_job_alpha1(self, name: str) -> Job:
1758+
"""Deprecated: use :meth:`get_job`.
1759+
1760+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1761+
for backwards compatibility and forwards to :meth:`get_job`.
1762+
"""
1763+
warn(
1764+
'get_job_alpha1 is deprecated; use get_job instead.',
1765+
DeprecationWarning,
1766+
stacklevel=2,
1767+
)
1768+
return self.get_job(name)
1769+
1770+
def delete_job(self, name: str) -> DaprResponse:
17401771
"""Deletes a scheduled job by name.
17411772
1742-
This is an Alpha API and is subject to change.
1773+
Calls the stable DeleteJob RPC and falls back to DeleteJobAlpha1 when the
1774+
sidecar predates the stable Jobs API.
17431775
17441776
Args:
17451777
name (str): The name of the job to delete.
@@ -1751,21 +1783,36 @@ def delete_job_alpha1(self, name: str) -> DaprResponse:
17511783
ValueError: If job name is empty.
17521784
DaprGrpcError: If the Dapr runtime returns an error.
17531785
"""
1754-
# Warnings and input validation
1755-
warn(
1756-
'The Jobs API is an Alpha version and is subject to change.',
1757-
UserWarning,
1758-
stacklevel=2,
1759-
)
17601786
validateNotBlankString(job_name=name)
17611787

17621788
request = api_v1.DeleteJobRequest(name=name)
17631789

17641790
try:
1765-
_, call = self.retry_policy.run_rpc(self._stub.DeleteJobAlpha1.with_call, request)
1766-
return DaprResponse(headers=call.initial_metadata())
1791+
_, call = self.retry_policy.run_rpc(self._stub.DeleteJob.with_call, request)
17671792
except RpcError as err:
1768-
raise DaprGrpcError(err) from err
1793+
if err.code() == StatusCode.UNIMPLEMENTED:
1794+
try:
1795+
_, call = self.retry_policy.run_rpc(
1796+
self._stub.DeleteJobAlpha1.with_call, request
1797+
)
1798+
except RpcError as err2:
1799+
raise DaprGrpcError(err2) from err2
1800+
else:
1801+
raise DaprGrpcError(err) from err
1802+
return DaprResponse(headers=call.initial_metadata())
1803+
1804+
def delete_job_alpha1(self, name: str) -> DaprResponse:
1805+
"""Deprecated: use :meth:`delete_job`.
1806+
1807+
The Jobs API graduated to stable in Dapr 1.18; this Alpha1 alias remains
1808+
for backwards compatibility and forwards to :meth:`delete_job`.
1809+
"""
1810+
warn(
1811+
'delete_job_alpha1 is deprecated; use delete_job instead.',
1812+
DeprecationWarning,
1813+
stacklevel=2,
1814+
)
1815+
return self.delete_job(name)
17691816

17701817
def wait(self, timeout_s: float):
17711818
"""Waits for sidecar to be available within the timeout.

dapr/ext/grpc/_servicer.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ def OnBindingEvent(self, request: BindingEventRequest, context):
247247
# TODO: support output bindings options
248248
return appcallback_v1.BindingEventResponse()
249249

250-
def OnJobEventAlpha1(self, request: JobEventRequest, context):
250+
def _handle_job_event(self, request: JobEventRequest, context):
251251
"""Handles job events from Dapr runtime.
252252
253253
This method is called by Dapr when a scheduled job is triggered.
@@ -280,6 +280,14 @@ def OnJobEventAlpha1(self, request: JobEventRequest, context):
280280
# Return empty response
281281
return appcallback_v1.JobEventResponse()
282282

283+
def OnJobEvent(self, request: JobEventRequest, context):
284+
"""Handles job events on the stable AppCallback service."""
285+
return self._handle_job_event(request, context)
286+
287+
def OnJobEventAlpha1(self, request: JobEventRequest, context):
288+
"""Handles job events on the deprecated AppCallbackAlpha service."""
289+
return self._handle_job_event(request, context)
290+
283291
def _handle_bulk_topic_event(
284292
self, request: TopicEventBulkRequest, context
285293
) -> Optional[TopicEventBulkResponse]:

dapr/ext/strands/AGENTS.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ manager = DaprSessionManager.from_address(
8080

8181
- `dapr` (core, same wheel as this extension)
8282
- `strands-agents >= 1.30.0, < 2.0.0`
83-
- `strands-agents-tools >= 0.2.22, < 1.0.0`
8483
- `python-ulid >= 3.0.0, < 4.0.0`
8584
- `msgpack >= 1.0, < 2.0`
8685

0 commit comments

Comments
 (0)