prefect 3.6.12__py3-none-any.whl → 3.6.13.dev2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/urls.py +29 -0
  3. prefect/_states.py +4 -1
  4. prefect/client/orchestration/_concurrency_limits/client.py +16 -16
  5. prefect/client/subscriptions.py +1 -1
  6. prefect/events/clients.py +52 -13
  7. prefect/runner/storage.py +3 -23
  8. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-C8JEQRHl.js} +2 -2
  9. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-C8JEQRHl.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-67V8kTg9.js} +2 -2
  11. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-67V8kTg9.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-DuxZ47Nn.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-DuxZ47Nn.js.map} +1 -1
  14. prefect/server/ui-v2/assets/automation._id-D8S8r4Ji.js +2 -0
  15. prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-D8S8r4Ji.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-C1fOM0Hx.js} +2 -2
  17. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-C1fOM0Hx.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-DrijTNGi.js} +2 -2
  19. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-DrijTNGi.js.map} +1 -1
  20. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-BDkqOkpe.js} +2 -2
  21. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-BDkqOkpe.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-CrFHWH5D.js} +2 -2
  23. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-CrFHWH5D.js.map} +1 -1
  24. prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +2 -0
  25. prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-WQNm0PzP.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-C3gN1Ae8.js} +2 -2
  27. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-C3gN1Ae8.js.map} +1 -1
  28. prefect/server/ui-v2/assets/block_._id.edit-DzPuSvat.js +2 -0
  29. prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-DzPuSvat.js.map} +1 -1
  30. prefect/server/ui-v2/assets/catalog-T-7MqsyE.js +2 -0
  31. prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-T-7MqsyE.js.map} +1 -1
  32. prefect/server/ui-v2/assets/catalog_._slug-DMOI61fc.js +2 -0
  33. prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-DMOI61fc.js.map} +1 -1
  34. prefect/server/ui-v2/assets/catalog_._slug_.create-l9bGUPi-.js +2 -0
  35. prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-l9bGUPi-.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-DM-Ze5-Y.js} +2 -2
  37. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-DM-Ze5-Y.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-BHEt9viF.js} +2 -2
  39. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-BHEt9viF.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-BMxUOyN5.js} +2 -2
  41. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-BMxUOyN5.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{create-noFojqGL.js → create-Cq-EAHVk.js} +2 -2
  43. prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-Cq-EAHVk.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bw8TZx9D.js} +2 -2
  45. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bw8TZx9D.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js → delete-confirmation-dialog-CTdWZlGM.js} +2 -2
  47. prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CTdWZlGM.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-BObYqmI_.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-BObYqmI_.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CntyhRrK.js} +3 -3
  51. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CntyhRrK.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-DBUSCaxB.js} +2 -2
  53. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-DBUSCaxB.js.map} +1 -1
  54. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-BXanVFA8.js} +2 -2
  55. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-BXanVFA8.js.map} +1 -1
  56. prefect/server/ui-v2/assets/deployment._id-Q5cvHMX9.js +2 -0
  57. prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-Q5cvHMX9.js.map} +1 -1
  58. prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-DB-4hHHc.js.map} +1 -1
  60. prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +2 -0
  61. prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-CWf1RIGy.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-CoHGXFoM.js} +2 -2
  63. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-CoHGXFoM.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-CT-s-V7d.js} +2 -2
  65. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-CT-s-V7d.js.map} +1 -1
  66. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-BITo_GYL.js} +2 -2
  67. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-BITo_GYL.js.map} +1 -1
  68. prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +2 -0
  69. prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js.map +1 -0
  70. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-Bbm9OpDi.js} +2 -2
  71. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-Bbm9OpDi.js.map} +1 -1
  72. prefect/server/ui-v2/assets/flow-run._id-BtSgRDtA.js +2 -0
  73. prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-BtSgRDtA.js.map} +1 -1
  74. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +4 -0
  75. prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +1 -0
  76. prefect/server/ui-v2/assets/flow-runs-pagination-LrU9Aio8.js +2 -0
  77. prefect/server/ui-v2/assets/flow-runs-pagination-LrU9Aio8.js.map +1 -0
  78. prefect/server/ui-v2/assets/flow._id-BJBRokk4.js +2 -0
  79. prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-BJBRokk4.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-CVSlEnl8.js} +2 -2
  81. prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-CVSlEnl8.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-4plZZheZ.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-4plZZheZ.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-B75eb688.js → header-9rXZ4r39.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-9rXZ4r39.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-D3uM8_xM.js} +2 -2
  87. prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-D3uM8_xM.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-6OsEYhIi.js} +2 -2
  89. prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-6OsEYhIi.js.map} +1 -1
  90. prefect/server/ui-v2/assets/index-B7xsJ-QH.js +2 -0
  91. prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-B7xsJ-QH.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-BeoNC2tJ.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-BeoNC2tJ.js.map} +1 -1
  94. prefect/server/ui-v2/assets/index-BfJLUM7N.js +2 -0
  95. prefect/server/ui-v2/assets/index-BfJLUM7N.js.map +1 -0
  96. prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-Bj0OOguP.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-Bj0OOguP.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-BlpD74iH.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-BlpD74iH.js.map} +1 -1
  100. prefect/server/ui-v2/assets/index-BvSl3DKP.js +17 -0
  101. prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +1 -0
  102. prefect/server/ui-v2/assets/index-CDwJvjUM.js +2 -0
  103. prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-CDwJvjUM.js.map} +1 -1
  104. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CDyLkbVG.js} +2 -2
  105. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CDyLkbVG.js.map} +1 -1
  106. prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-ChIrfjIW.js} +2 -2
  107. prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-ChIrfjIW.js.map} +1 -1
  108. prefect/server/ui-v2/assets/index-CzCSgCK-.js +2 -0
  109. prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-CzCSgCK-.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-D5v9S-lB.js +2 -0
  111. prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-D5v9S-lB.js.map} +1 -1
  112. prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-D6GJ4go1.js} +2 -2
  113. prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-D6GJ4go1.js.map} +1 -1
  114. prefect/server/ui-v2/assets/index-DJyKqsFO.js +2 -0
  115. prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-DJyKqsFO.js.map} +1 -1
  116. prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-DODEq1Pi.js} +2 -2
  117. prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-DODEq1Pi.js.map} +1 -1
  118. prefect/server/ui-v2/assets/index-DicK6p3K.js +2 -0
  119. prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-DicK6p3K.js.map} +1 -1
  120. prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-DqCPbST9.js} +2 -2
  121. prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-DqCPbST9.js.map} +1 -1
  122. prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-DxPoKag8.js} +2 -2
  123. prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-DxPoKag8.js.map} +1 -1
  124. prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
  125. prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-h9-QgNjZ.js} +2 -2
  126. prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-h9-QgNjZ.js.map} +1 -1
  127. prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-tBdv6kBF.js} +2 -2
  128. prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-tBdv6kBF.js.map} +1 -1
  129. prefect/server/ui-v2/assets/index-udb79rgq.js +2 -0
  130. prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-udb79rgq.js.map} +1 -1
  131. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-Dt1icmrn.js} +2 -2
  132. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-Dt1icmrn.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-Cyh5MBX_.js} +2 -2
  134. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-Cyh5MBX_.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-BwIwKFRF.js} +2 -2
  136. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-BwIwKFRF.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DKXFVSwk.js} +2 -2
  138. prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DKXFVSwk.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-Dp0mBlkV.js} +2 -2
  140. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-Dp0mBlkV.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-BYwPjHI5.js} +3 -3
  142. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-BYwPjHI5.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-y26XMqXw.js} +2 -2
  144. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-y26XMqXw.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-D0van45v.js} +2 -2
  146. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-D0van45v.js.map} +1 -1
  147. prefect/server/ui-v2/assets/route-error-state-CGGpuCGN.js +2 -0
  148. prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-CGGpuCGN.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-2tg5SXM4.js} +2 -2
  150. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-2tg5SXM4.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-CZt6AJ4z.js} +4 -4
  152. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js.map → schema-form-input-string-format-datetime-CZt6AJ4z.js.map} +1 -1
  153. prefect/server/ui-v2/assets/settings-DDUadk_N.js +2 -0
  154. prefect/server/ui-v2/assets/settings-DDUadk_N.js.map +1 -0
  155. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-D9p3cPx9.js} +2 -2
  156. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-D9p3cPx9.js.map} +1 -1
  157. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
  158. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
  159. prefect/server/ui-v2/assets/table-vo9Do8sA.js +2 -0
  160. prefect/server/ui-v2/assets/table-vo9Do8sA.js.map +1 -0
  161. prefect/server/ui-v2/assets/tags-input-Ci2JQ-k3.js +2 -0
  162. prefect/server/ui-v2/assets/tags-input-Ci2JQ-k3.js.map +1 -0
  163. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CJzPc2gw.js +2 -0
  164. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG3den1B.js.map → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map} +1 -1
  165. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CjevSs79.js} +3 -3
  166. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CjevSs79.js.map} +1 -1
  167. prefect/server/ui-v2/assets/task-run._id-D8QKG5UZ.js +2 -0
  168. prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-D8QKG5UZ.js.map} +1 -1
  169. prefect/server/ui-v2/assets/task-runs-pagination-CifoSGct.js +2 -0
  170. prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-CifoSGct.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-BAtfAxtV.js} +2 -2
  172. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-BAtfAxtV.js.map} +1 -1
  173. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-QlQTZSsF.js} +2 -2
  174. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-QlQTZSsF.js.map} +1 -1
  175. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-BJN1vjEh.js} +2 -2
  176. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-BJN1vjEh.js.map} +1 -1
  177. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-eOWJYPkD.js +2 -0
  178. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-eOWJYPkD.js.map} +1 -1
  179. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-BTwSeHRM.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js.map → use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-BL_Gv9CC.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-BL_Gv9CC.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-TSCoomjQ.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js.map → use-get-artifacts-flow-task-runs-TSCoomjQ.js.map} +1 -1
  185. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BMnCkwSv.js} +2 -2
  186. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BMnCkwSv.js.map} +1 -1
  187. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-C1wm66U2.js} +2 -2
  188. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-C1wm66U2.js.map} +1 -1
  189. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-DxRXxFOF.js} +2 -2
  190. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-DxRXxFOF.js.map} +1 -1
  191. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-PudrkZYj.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-PudrkZYj.js.map} +1 -1
  193. prefect/server/ui-v2/assets/work-pool-queue-toggle-BAOrV_0R.js +2 -0
  194. prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-BAOrV_0R.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BOM3849e.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BOM3849e.js.map} +1 -1
  197. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CIhcG6yr.js +2 -0
  198. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-CIhcG6yr.js.map} +1 -1
  199. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map} +1 -1
  201. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-CP4yX3uM.js} +2 -2
  202. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-CP4yX3uM.js.map} +1 -1
  203. prefect/server/ui-v2/index.html +2 -2
  204. prefect/task_engine.py +16 -0
  205. prefect/task_worker.py +98 -16
  206. prefect/testing/fixtures.py +18 -1
  207. {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/METADATA +1 -1
  208. {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/RECORD +211 -210
  209. prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
  210. prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
  211. prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
  212. prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
  213. prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
  214. prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
  215. prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
  216. prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
  217. prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
  218. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
  219. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
  220. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
  221. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
  222. prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
  223. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
  224. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
  225. prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
  226. prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
  227. prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
  228. prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
  229. prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
  230. prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
  231. prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
  232. prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
  233. prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
  234. prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
  235. prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
  236. prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
  237. prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
  238. prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
  239. prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
  240. prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
  241. prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
  242. prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
  243. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
  244. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
  245. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
  246. prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
  247. prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
  248. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
  249. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
  250. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
  251. prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
  252. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
  253. {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/WHEEL +0 -0
  254. {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/entry_points.txt +0 -0
  255. {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/licenses/LICENSE +0 -0
prefect/task_worker.py CHANGED
@@ -22,6 +22,7 @@ from websockets.exceptions import InvalidStatus
22
22
 
23
23
  import prefect.types._datetime
24
24
  from prefect import Task
25
+ from prefect._internal.compatibility.async_dispatch import async_dispatch
25
26
  from prefect._internal.compatibility.blocks import call_explicitly_async_block_method
26
27
  from prefect._internal.concurrency.api import create_call, from_sync
27
28
  from prefect.cache_policies import DEFAULT, NO_CACHE
@@ -40,7 +41,7 @@ from prefect.states import Pending
40
41
  from prefect.task_engine import run_task_async, run_task_sync
41
42
  from prefect.types import DateTime
42
43
  from prefect.utilities.annotations import NotSet
43
- from prefect.utilities.asyncutils import asyncnullcontext, sync_compatible
44
+ from prefect.utilities.asyncutils import asyncnullcontext
44
45
  from prefect.utilities.engine import emit_task_run_state_change_event
45
46
  from prefect.utilities.processutils import (
46
47
  _register_signal, # pyright: ignore[reportPrivateUsage]
@@ -169,12 +170,11 @@ class TaskWorker:
169
170
  Shuts down the task worker when a SIGTERM is received.
170
171
  """
171
172
  logger.info("SIGTERM received, initiating graceful shutdown...")
172
- from_sync.call_in_loop_thread(create_call(self.stop))
173
+ from_sync.call_in_loop_thread(create_call(self.astop))
173
174
 
174
175
  sys.exit(0)
175
176
 
176
- @sync_compatible
177
- async def start(self, timeout: Optional[float] = None) -> None:
177
+ async def astart(self, timeout: Optional[float] = None) -> None:
178
178
  """
179
179
  Starts a task worker, which runs the tasks provided in the constructor.
180
180
 
@@ -203,8 +203,20 @@ class TaskWorker:
203
203
  else:
204
204
  raise
205
205
 
206
- @sync_compatible
207
- async def stop(self):
206
+ @async_dispatch(astart)
207
+ def start(self, timeout: Optional[float] = None) -> None:
208
+ """
209
+ Starts a task worker, which runs the tasks provided in the constructor.
210
+
211
+ Args:
212
+ timeout: If provided, the task worker will exit after the given number of
213
+ seconds. Defaults to None, meaning the task worker will run indefinitely.
214
+ """
215
+ from_sync.call_soon_in_loop_thread(
216
+ create_call(self.astart, timeout=timeout)
217
+ ).result()
218
+
219
+ async def astop(self) -> None:
208
220
  """Stops the task worker's polling cycle."""
209
221
  if not self.started:
210
222
  raise RuntimeError(
@@ -217,6 +229,11 @@ class TaskWorker:
217
229
 
218
230
  raise StopTaskWorker
219
231
 
232
+ @async_dispatch(astop)
233
+ def stop(self) -> None:
234
+ """Stops the task worker's polling cycle."""
235
+ from_sync.call_soon_in_loop_thread(create_call(self.astop)).result()
236
+
220
237
  async def _acquire_token(self, task_run_id: UUID) -> bool:
221
238
  try:
222
239
  if self._limiter:
@@ -432,13 +449,12 @@ def create_status_server(task_worker: TaskWorker) -> FastAPI:
432
449
  return status_app
433
450
 
434
451
 
435
- @sync_compatible
436
- async def serve(
452
+ async def aserve(
437
453
  *tasks: Task[P, R],
438
454
  limit: Optional[int] = 10,
439
455
  status_server_port: Optional[int] = None,
440
456
  timeout: Optional[float] = None,
441
- ):
457
+ ) -> None:
442
458
  """Serve the provided tasks so that their runs may be submitted to
443
459
  and executed in the engine. Tasks do not need to be within a flow run context to be
444
460
  submitted. You must `.submit` the same task object that you pass to `serve`.
@@ -468,7 +484,7 @@ async def serve(
468
484
  print(message.upper())
469
485
 
470
486
  # starts a long-lived process that listens for scheduled runs of these tasks
471
- serve(say, yell)
487
+ await aserve(say, yell)
472
488
  ```
473
489
  """
474
490
  task_worker = TaskWorker(*tasks, limit=limit)
@@ -488,7 +504,7 @@ async def serve(
488
504
  status_server_task = loop.create_task(server.serve())
489
505
 
490
506
  try:
491
- await task_worker.start(timeout=timeout)
507
+ await task_worker.astart(timeout=timeout)
492
508
 
493
509
  except TimeoutError:
494
510
  if timeout is not None:
@@ -497,13 +513,29 @@ async def serve(
497
513
  raise
498
514
 
499
515
  except BaseExceptionGroup as exc: # novermin
500
- exceptions = exc.exceptions
501
- n_exceptions = len(exceptions)
502
- logger.error(
503
- f"Task worker stopped with {n_exceptions} exception{'s' if n_exceptions != 1 else ''}:"
504
- f"\n" + "\n".join(str(e) for e in exceptions)
516
+ # Unwrap exception groups to handle inner exceptions appropriately
517
+ # split() returns (matching, rest) - we want to separate expected from unexpected
518
+ expected, unexpected = exc.split(
519
+ (StopTaskWorker, asyncio.CancelledError, KeyboardInterrupt, TimeoutError)
505
520
  )
506
521
 
522
+ if expected:
523
+ # Handle expected shutdown exceptions
524
+ for e in expected.exceptions:
525
+ if isinstance(e, StopTaskWorker):
526
+ logger.info("Task worker stopped.")
527
+ elif isinstance(e, TimeoutError):
528
+ if timeout is not None:
529
+ logger.info(
530
+ f"Task worker timed out after {timeout} seconds. Exiting..."
531
+ )
532
+ elif isinstance(e, (asyncio.CancelledError, KeyboardInterrupt)):
533
+ logger.info("Task worker interrupted, stopping...")
534
+
535
+ if unexpected:
536
+ # Re-raise unexpected exceptions so they're not silently swallowed
537
+ raise unexpected
538
+
507
539
  except StopTaskWorker:
508
540
  logger.info("Task worker stopped.")
509
541
 
@@ -519,6 +551,56 @@ async def serve(
519
551
  pass
520
552
 
521
553
 
554
+ @async_dispatch(aserve)
555
+ def serve(
556
+ *tasks: Task[P, R],
557
+ limit: Optional[int] = 10,
558
+ status_server_port: Optional[int] = None,
559
+ timeout: Optional[float] = None,
560
+ ) -> None:
561
+ """Serve the provided tasks so that their runs may be submitted to
562
+ and executed in the engine. Tasks do not need to be within a flow run context to be
563
+ submitted. You must `.submit` the same task object that you pass to `serve`.
564
+
565
+ Args:
566
+ - tasks: A list of tasks to serve. When a scheduled task run is found for a
567
+ given task, the task run will be submitted to the engine for execution.
568
+ - limit: The maximum number of tasks that can be run concurrently. Defaults to 10.
569
+ Pass `None` to remove the limit.
570
+ - status_server_port: An optional port on which to start an HTTP server
571
+ exposing status information about the task worker. If not provided, no
572
+ status server will run.
573
+ - timeout: If provided, the task worker will exit after the given number of
574
+ seconds. Defaults to None, meaning the task worker will run indefinitely.
575
+
576
+ Example:
577
+ ```python
578
+ from prefect import task
579
+ from prefect.task_worker import serve
580
+
581
+ @task(log_prints=True)
582
+ def say(message: str):
583
+ print(message)
584
+
585
+ @task(log_prints=True)
586
+ def yell(message: str):
587
+ print(message.upper())
588
+
589
+ # starts a long-lived process that listens for scheduled runs of these tasks
590
+ serve(say, yell)
591
+ ```
592
+ """
593
+ from_sync.call_soon_in_loop_thread(
594
+ create_call(
595
+ aserve,
596
+ *tasks,
597
+ limit=limit,
598
+ status_server_port=status_server_port,
599
+ timeout=timeout,
600
+ )
601
+ ).result()
602
+
603
+
522
604
  async def store_parameters(
523
605
  result_store: ResultStore, identifier: UUID, parameters: dict[str, Any]
524
606
  ) -> None:
@@ -1,7 +1,9 @@
1
1
  import asyncio
2
2
  import json
3
3
  import os
4
+ import signal
4
5
  import socket
6
+ import subprocess
5
7
  import sys
6
8
  from contextlib import contextmanager
7
9
  from typing import Any, AsyncGenerator, Callable, Generator, List, Optional, Union
@@ -83,6 +85,14 @@ async def hosted_api_server(
83
85
 
84
86
  # Will connect to the same database as normal test clients
85
87
  settings = get_current_settings().to_environment_variables(exclude_unset=True)
88
+
89
+ # We must add creationflags to a dict so it is only passed as a function
90
+ # parameter on Windows, because the presence of creationflags causes
91
+ # errors on Unix even if set to None
92
+ kwargs: dict[str, object] = {}
93
+ if sys.platform == "win32":
94
+ kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP
95
+
86
96
  async with open_process(
87
97
  command=[
88
98
  "uvicorn",
@@ -101,6 +111,7 @@ async def hosted_api_server(
101
111
  **os.environ,
102
112
  **settings,
103
113
  },
114
+ **kwargs,
104
115
  ) as process:
105
116
  api_url = f"http://localhost:{port}/api"
106
117
 
@@ -129,7 +140,13 @@ async def hosted_api_server(
129
140
 
130
141
  # Then shutdown the process
131
142
  try:
132
- process.terminate()
143
+ # In a non-windows environment first send a SIGTERM via terminate().
144
+ # In Windows we use CTRL_BREAK_EVENT as SIGTERM is useless:
145
+ # https://bugs.python.org/issue26350
146
+ if sys.platform == "win32":
147
+ os.kill(process.pid, signal.CTRL_BREAK_EVENT)
148
+ else:
149
+ process.terminate()
133
150
 
134
151
  # Give the process a 10 second grace period to shutdown
135
152
  for _ in range(10):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect
3
- Version: 3.6.12
3
+ Version: 3.6.13.dev2
4
4
  Summary: Workflow orchestration and management.
5
5
  Project-URL: Changelog, https://github.com/PrefectHQ/prefect/releases
6
6
  Project-URL: Documentation, https://docs.prefect.io