prefect 3.6.12__py3-none-any.whl → 3.6.13__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 (266) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/compatibility/blocks.py +18 -0
  3. prefect/_internal/urls.py +29 -0
  4. prefect/_states.py +4 -1
  5. prefect/client/orchestration/_concurrency_limits/client.py +16 -16
  6. prefect/client/schemas/filters.py +24 -0
  7. prefect/client/subscriptions.py +1 -1
  8. prefect/events/clients.py +52 -13
  9. prefect/flow_engine.py +192 -10
  10. prefect/flows.py +61 -2
  11. prefect/results.py +262 -21
  12. prefect/runner/runner.py +29 -82
  13. prefect/runner/storage.py +6 -25
  14. prefect/server/schemas/filters.py +45 -0
  15. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-CUEaRDGw.js} +2 -2
  16. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-CUEaRDGw.js.map} +1 -1
  17. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-Ca6VCUS0.js} +2 -2
  18. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-Ca6VCUS0.js.map} +1 -1
  19. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-z26pICBl.js} +2 -2
  20. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-z26pICBl.js.map} +1 -1
  21. prefect/server/ui-v2/assets/automation._id-DuodjY5t.js +2 -0
  22. prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-DuodjY5t.js.map} +1 -1
  23. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-CcuJhc-y.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-CcuJhc-y.js.map} +1 -1
  25. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-CgOWwuc6.js} +2 -2
  26. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-CgOWwuc6.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-DN9HyjM5.js} +2 -2
  28. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-DN9HyjM5.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-rrToxL5r.js} +2 -2
  30. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-rrToxL5r.js.map} +1 -1
  31. prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +2 -0
  32. prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-DURScH8H.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-Bue6lnrN.js} +2 -2
  34. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-Bue6lnrN.js.map} +1 -1
  35. prefect/server/ui-v2/assets/block_._id.edit-QY0OzN_b.js +2 -0
  36. prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-QY0OzN_b.js.map} +1 -1
  37. prefect/server/ui-v2/assets/catalog-CGjRGWv6.js +2 -0
  38. prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-CGjRGWv6.js.map} +1 -1
  39. prefect/server/ui-v2/assets/catalog_._slug-BMFNZhEb.js +2 -0
  40. prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-BMFNZhEb.js.map} +1 -1
  41. prefect/server/ui-v2/assets/catalog_._slug_.create-CuFA3kUC.js +2 -0
  42. prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-CuFA3kUC.js.map} +1 -1
  43. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-Ell2FjrX.js} +2 -2
  44. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-Ell2FjrX.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-Rr1ysUct.js} +2 -2
  46. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-Rr1ysUct.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{create-noFojqGL.js → create-CQK8-uO1.js} +2 -2
  48. prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-CQK8-uO1.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-ewA3uq_h.js} +2 -2
  50. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-ewA3uq_h.js.map} +1 -1
  51. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bx1uYX_M.js} +2 -2
  52. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bx1uYX_M.js.map} +1 -1
  53. prefect/server/ui-v2/assets/delete-confirmation-dialog-CqKsUEj_.js +2 -0
  54. prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CqKsUEj_.js.map} +1 -1
  55. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-Bz5COdER.js} +2 -2
  56. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-Bz5COdER.js.map} +1 -1
  57. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CrlZlNoj.js} +3 -3
  58. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CrlZlNoj.js.map} +1 -1
  59. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-D9ZR_vmp.js} +2 -2
  60. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-D9ZR_vmp.js.map} +1 -1
  61. prefect/server/ui-v2/assets/deployment._id-BV0rSqba.js +2 -0
  62. prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-BV0rSqba.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-DvHhx-qN.js} +2 -2
  64. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-DvHhx-qN.js.map} +1 -1
  65. prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +2 -0
  66. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-BrEOenqP.js.map} +1 -1
  67. prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +2 -0
  68. prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-BbYKPK42.js.map} +1 -1
  69. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-Dv7S_MJR.js} +2 -2
  70. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-Dv7S_MJR.js.map} +1 -1
  71. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-e0Fqb6aw.js} +2 -2
  72. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-e0Fqb6aw.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-Cp4UmGqq.js} +2 -2
  74. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-Cp4UmGqq.js.map} +1 -1
  75. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +2 -0
  76. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js.map +1 -0
  77. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-BOp38Pbq.js} +2 -2
  78. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-BOp38Pbq.js.map} +1 -1
  79. prefect/server/ui-v2/assets/flow-run._id-DJnTDEN_.js +2 -0
  80. prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-DJnTDEN_.js.map} +1 -1
  81. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +4 -0
  82. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +1 -0
  83. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js +2 -0
  84. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js.map +1 -0
  85. prefect/server/ui-v2/assets/flow._id-eCBL95rg.js +2 -0
  86. prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-eCBL95rg.js.map} +1 -1
  87. prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-DNerk3LS.js} +2 -2
  88. prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-DNerk3LS.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-B0ejRncu.js} +2 -2
  90. prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-B0ejRncu.js.map} +1 -1
  91. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-DwagHBlF.js} +2 -2
  92. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-DwagHBlF.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{header-B75eb688.js → header-huSvwxKI.js} +2 -2
  94. prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-huSvwxKI.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-BO3SOwdV.js} +2 -2
  96. prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-BO3SOwdV.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-BTPE3vs7.js} +2 -2
  98. prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-BTPE3vs7.js.map} +1 -1
  99. prefect/server/ui-v2/assets/index-BU4yZRd3.js +2 -0
  100. prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-BU4yZRd3.js.map} +1 -1
  101. prefect/server/ui-v2/assets/index-BhALpenO.js +2 -0
  102. prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-BhALpenO.js.map} +1 -1
  103. prefect/server/ui-v2/assets/index-BzN9bQeM.js +2 -0
  104. prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-BzN9bQeM.js.map} +1 -1
  105. prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-CBhi1P9g.js} +2 -2
  106. prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-CBhi1P9g.js.map} +1 -1
  107. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CRDz4nhM.js} +2 -2
  108. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CRDz4nhM.js.map} +1 -1
  109. prefect/server/ui-v2/assets/index-CTnoa3Ho.js +2 -0
  110. prefect/server/ui-v2/assets/index-CTnoa3Ho.js.map +1 -0
  111. prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-CWkbSdxY.js} +2 -2
  112. prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-CWkbSdxY.js.map} +1 -1
  113. prefect/server/ui-v2/assets/index-CgOsOj5t.js +2 -0
  114. prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-CgOsOj5t.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-CnIJUujl.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-CnIJUujl.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-Cutg_A1j.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-Cutg_A1j.js.map} +1 -1
  119. prefect/server/ui-v2/assets/index-D5RdrxkU.js +17 -0
  120. prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +1 -0
  121. prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-DDiyFpIV.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-DDiyFpIV.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-DI2DC5gd.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-DI2DC5gd.js.map} +1 -1
  125. prefect/server/ui-v2/assets/index-Dg_duvDx.js +2 -0
  126. prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-Dg_duvDx.js.map} +1 -1
  127. prefect/server/ui-v2/assets/index-Dspw5HFj.js +2 -0
  128. prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-Dspw5HFj.js.map} +1 -1
  129. prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
  130. prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-VOOLxiSE.js} +2 -2
  131. prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-VOOLxiSE.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-Wfs7Cjew.js} +2 -2
  133. prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-Wfs7Cjew.js.map} +1 -1
  134. prefect/server/ui-v2/assets/index-dSUEBAqg.js +2 -0
  135. prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-dSUEBAqg.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-uvH5a3zO.js} +2 -2
  137. prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-uvH5a3zO.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-gXz7BuJj.js} +2 -2
  139. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-gXz7BuJj.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-CJPbLXwU.js} +2 -2
  141. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-CJPbLXwU.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-wPid80zf.js} +2 -2
  143. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-wPid80zf.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DC63bGXK.js} +2 -2
  145. prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DC63bGXK.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-BhqrU6Eo.js} +2 -2
  147. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-BhqrU6Eo.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-3jtXWQZN.js} +3 -3
  149. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-3jtXWQZN.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-ZVi-v324.js} +2 -2
  151. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-ZVi-v324.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-BBMLpHGc.js} +2 -2
  153. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-BBMLpHGc.js.map} +1 -1
  154. prefect/server/ui-v2/assets/route-error-state-BJXl8qkX.js +2 -0
  155. prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-BJXl8qkX.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-BEqYjsM-.js} +2 -2
  157. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-BEqYjsM-.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-l3xt3PWf.js} +4 -4
  159. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js.map → schema-form-input-string-format-datetime-l3xt3PWf.js.map} +1 -1
  160. prefect/server/ui-v2/assets/settings-txD0dR5Q.js +2 -0
  161. prefect/server/ui-v2/assets/settings-txD0dR5Q.js.map +1 -0
  162. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-DHPFdKZ2.js} +2 -2
  163. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-DHPFdKZ2.js.map} +1 -1
  164. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
  165. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
  166. prefect/server/ui-v2/assets/table-ULfpXJXB.js +2 -0
  167. prefect/server/ui-v2/assets/table-ULfpXJXB.js.map +1 -0
  168. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js +2 -0
  169. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js.map +1 -0
  170. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-BpeKHk7g.js +2 -0
  171. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG3den1B.js.map → task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CkOl9MJs.js} +3 -3
  173. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CkOl9MJs.js.map} +1 -1
  174. prefect/server/ui-v2/assets/task-run._id-udkz1lhh.js +2 -0
  175. prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-udkz1lhh.js.map} +1 -1
  176. prefect/server/ui-v2/assets/task-runs-pagination-B7D5K_FM.js +2 -0
  177. prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-B7D5K_FM.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-C4bdj7Jk.js} +2 -2
  179. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-C4bdj7Jk.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-AdlSRQxZ.js} +2 -2
  181. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-AdlSRQxZ.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-C-vxYz4l.js} +2 -2
  183. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-C-vxYz4l.js.map} +1 -1
  184. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Cqhaqtqe.js +2 -0
  185. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-GjNhFxZe.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js.map → use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-DfwmswyR.js} +2 -2
  189. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-DfwmswyR.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-BEBpG_5J.js} +2 -2
  191. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js.map → use-get-artifacts-flow-task-runs-BEBpG_5J.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BYBRcDwC.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BYBRcDwC.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-Bk97vOTm.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-Bk97vOTm.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-BQwGFLk5.js} +2 -2
  197. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-BQwGFLk5.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-Ddhp_M-L.js} +2 -2
  199. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-Ddhp_M-L.js.map} +1 -1
  200. prefect/server/ui-v2/assets/work-pool-queue-toggle-DX3eV3R_.js +2 -0
  201. prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-DX3eV3R_.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BaRIsXBX.js} +2 -2
  203. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BaRIsXBX.js.map} +1 -1
  204. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-dhS_Xz32.js +2 -0
  205. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-dhS_Xz32.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-_Ez8e2dw.js} +2 -2
  209. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-_Ez8e2dw.js.map} +1 -1
  210. prefect/server/ui-v2/index.html +2 -2
  211. prefect/settings/models/flows.py +14 -1
  212. prefect/settings/models/runner.py +16 -6
  213. prefect/task_engine.py +17 -3
  214. prefect/task_worker.py +99 -17
  215. prefect/tasks.py +2 -2
  216. prefect/testing/fixtures.py +41 -6
  217. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/METADATA +1 -1
  218. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/RECORD +221 -220
  219. prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
  220. prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
  221. prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
  222. prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
  224. prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
  225. prefect/server/ui-v2/assets/delete-confirmation-dialog-COdZmNfa.js +0 -2
  226. prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
  227. prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
  228. prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
  229. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
  230. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
  231. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
  232. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
  233. prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
  234. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
  235. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
  236. prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
  237. prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
  238. prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
  239. prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
  240. prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
  241. prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
  242. prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
  243. prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
  244. prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
  245. prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
  246. prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
  247. prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
  248. prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
  249. prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
  250. prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
  251. prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
  252. prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
  253. prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
  254. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
  255. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
  256. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
  257. prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
  258. prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
  259. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
  260. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
  261. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
  262. prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
  263. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
  264. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/WHEEL +0 -0
  265. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/entry_points.txt +0 -0
  266. {prefect-3.6.12.dist-info → prefect-3.6.13.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:
@@ -317,7 +334,7 @@ class TaskWorker:
317
334
  task.persist_result = True
318
335
  store = await ResultStore(
319
336
  result_storage=await get_or_create_default_task_scheduling_storage()
320
- ).update_for_task(task)
337
+ ).aupdate_for_task(task)
321
338
  try:
322
339
  run_data: dict[str, Any] = await read_parameters(store, parameters_id)
323
340
  parameters = run_data.get("parameters", {})
@@ -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:
prefect/tasks.py CHANGED
@@ -919,7 +919,7 @@ class Task(Generic[P, R]):
919
919
 
920
920
  store = await ResultStore(
921
921
  result_storage=await get_or_create_default_task_scheduling_storage()
922
- ).update_for_task(self)
922
+ ).aupdate_for_task(self)
923
923
  context = serialize_context()
924
924
  data: dict[str, Any] = {"context": context}
925
925
  if parameters:
@@ -1024,7 +1024,7 @@ class Task(Generic[P, R]):
1024
1024
 
1025
1025
  store = await ResultStore(
1026
1026
  result_storage=await get_or_create_default_task_scheduling_storage()
1027
- ).update_for_task(self)
1027
+ ).aupdate_for_task(self)
1028
1028
  context = serialize_context()
1029
1029
  data: dict[str, Any] = {"context": context}
1030
1030
  if parameters:
@@ -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
@@ -20,6 +22,7 @@ from websockets.asyncio.server import (
20
22
  )
21
23
  from websockets.exceptions import ConnectionClosed
22
24
 
25
+ from prefect._internal.compatibility.async_dispatch import async_dispatch
23
26
  from prefect.events import Event
24
27
  from prefect.events.clients import (
25
28
  AssertingEventsClient,
@@ -37,7 +40,7 @@ from prefect.settings import (
37
40
  temporary_settings,
38
41
  )
39
42
  from prefect.types._datetime import DateTime, now
40
- from prefect.utilities.asyncutils import sync_compatible
43
+ from prefect.utilities.asyncutils import run_coro_as_sync
41
44
  from prefect.utilities.processutils import open_process
42
45
 
43
46
 
@@ -83,6 +86,14 @@ async def hosted_api_server(
83
86
 
84
87
  # Will connect to the same database as normal test clients
85
88
  settings = get_current_settings().to_environment_variables(exclude_unset=True)
89
+
90
+ # We must add creationflags to a dict so it is only passed as a function
91
+ # parameter on Windows, because the presence of creationflags causes
92
+ # errors on Unix even if set to None
93
+ kwargs: dict[str, object] = {}
94
+ if sys.platform == "win32":
95
+ kwargs["creationflags"] = subprocess.CREATE_NEW_PROCESS_GROUP
96
+
86
97
  async with open_process(
87
98
  command=[
88
99
  "uvicorn",
@@ -101,6 +112,7 @@ async def hosted_api_server(
101
112
  **os.environ,
102
113
  **settings,
103
114
  },
115
+ **kwargs,
104
116
  ) as process:
105
117
  api_url = f"http://localhost:{port}/api"
106
118
 
@@ -129,7 +141,13 @@ async def hosted_api_server(
129
141
 
130
142
  # Then shutdown the process
131
143
  try:
132
- process.terminate()
144
+ # In a non-windows environment first send a SIGTERM via terminate().
145
+ # In Windows we use CTRL_BREAK_EVENT as SIGTERM is useless:
146
+ # https://bugs.python.org/issue26350
147
+ if sys.platform == "win32":
148
+ os.kill(process.pid, signal.CTRL_BREAK_EVENT)
149
+ else:
150
+ process.terminate()
133
151
 
134
152
  # Give the process a 10 second grace period to shutdown
135
153
  for _ in range(10):
@@ -423,8 +441,7 @@ async def events_pipeline(
423
441
  asserting_events_worker: EventsWorker,
424
442
  ) -> AsyncGenerator[EventsPipeline, None]:
425
443
  class AssertingEventsPipeline(EventsPipeline):
426
- @sync_compatible
427
- async def process_events(
444
+ async def aprocess_events(
428
445
  self,
429
446
  dequeue_events: bool = True,
430
447
  min_events: int = 0,
@@ -452,6 +469,21 @@ async def events_pipeline(
452
469
  messages = self.events_to_messages(events)
453
470
  await self.process_messages(messages)
454
471
 
472
+ @async_dispatch(aprocess_events)
473
+ def process_events(
474
+ self,
475
+ dequeue_events: bool = True,
476
+ min_events: int = 0,
477
+ timeout: int = 10,
478
+ ):
479
+ return run_coro_as_sync(
480
+ self.aprocess_events(
481
+ dequeue_events=dequeue_events,
482
+ min_events=min_events,
483
+ timeout=timeout,
484
+ )
485
+ )
486
+
455
487
  yield AssertingEventsPipeline()
456
488
 
457
489
 
@@ -460,14 +492,17 @@ async def emitting_events_pipeline(
460
492
  asserting_and_emitting_events_worker: EventsWorker,
461
493
  ) -> AsyncGenerator[EventsPipeline, None]:
462
494
  class AssertingAndEmittingEventsPipeline(EventsPipeline):
463
- @sync_compatible
464
- async def process_events(self):
495
+ async def aprocess_events(self):
465
496
  asserting_and_emitting_events_worker.wait_until_empty()
466
497
  events = asserting_and_emitting_events_worker._client.pop_events()
467
498
 
468
499
  messages = self.events_to_messages(events)
469
500
  await self.process_messages(messages)
470
501
 
502
+ @async_dispatch(aprocess_events)
503
+ def process_events(self):
504
+ return run_coro_as_sync(self.aprocess_events())
505
+
471
506
  yield AssertingAndEmittingEventsPipeline()
472
507
 
473
508
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: prefect
3
- Version: 3.6.12
3
+ Version: 3.6.13
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