prefect 3.6.13__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.
- prefect/_build_info.py +3 -3
- prefect/_internal/compatibility/blocks.py +0 -18
- prefect/client/schemas/filters.py +0 -24
- prefect/flow_engine.py +10 -192
- prefect/flows.py +2 -61
- prefect/results.py +21 -262
- prefect/runner/runner.py +82 -29
- prefect/runner/storage.py +2 -3
- prefect/server/schemas/filters.py +0 -45
- prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js → artifact-card-C8JEQRHl.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-CUEaRDGw.js.map → artifact-card-C8JEQRHl.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js → artifact._id-67V8kTg9.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-Ca6VCUS0.js.map → artifact._id-67V8kTg9.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js → automation-wizard-DuxZ47Nn.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-z26pICBl.js.map → automation-wizard-DuxZ47Nn.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js → automation._id-D8S8r4Ji.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-DuodjY5t.js.map → automation._id-D8S8r4Ji.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js → automation_._id.edit-C1fOM0Hx.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-CcuJhc-y.js.map → automation_._id.edit-C1fOM0Hx.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js → automations-header-DrijTNGi.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-CgOWwuc6.js.map → automations-header-DrijTNGi.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js → base-job-template-form-section-BDkqOkpe.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DN9HyjM5.js.map → base-job-template-form-section-BDkqOkpe.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js → block-type-details-CrFHWH5D.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-rrToxL5r.js.map → block-type-details-CrFHWH5D.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-DURScH8H.js.map → block-type-logo-WQNm0PzP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js → block._id-C3gN1Ae8.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-Bue6lnrN.js.map → block._id-C3gN1Ae8.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js → block_._id.edit-DzPuSvat.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-QY0OzN_b.js.map → block_._id.edit-DzPuSvat.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js → catalog-T-7MqsyE.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-CGjRGWv6.js.map → catalog-T-7MqsyE.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js → catalog_._slug-DMOI61fc.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-BMFNZhEb.js.map → catalog_._slug-DMOI61fc.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js → catalog_._slug_.create-l9bGUPi-.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-CuFA3kUC.js.map → catalog_._slug_.create-l9bGUPi-.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js → collapsible-DM-Ze5-Y.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-Ell2FjrX.js.map → collapsible-DM-Ze5-Y.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js → concurrency-limit._id-BHEt9viF.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-Rr1ysUct.js.map → concurrency-limit._id-BHEt9viF.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-ewA3uq_h.js → create-BMxUOyN5.js} +2 -2
- prefect/server/ui-v2/assets/{create-ewA3uq_h.js.map → create-BMxUOyN5.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-CQK8-uO1.js → create-Cq-EAHVk.js} +2 -2
- prefect/server/ui-v2/assets/{create-CQK8-uO1.js.map → create-Cq-EAHVk.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js → data-table-Bw8TZx9D.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-Bx1uYX_M.js.map → data-table-Bw8TZx9D.js.map} +1 -1
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js → delete-confirmation-dialog-CTdWZlGM.js} +2 -2
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-CqKsUEj_.js.map → delete-confirmation-dialog-CTdWZlGM.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js → deployment-action-header-BObYqmI_.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-Bz5COdER.js.map → deployment-action-header-BObYqmI_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js → deployment-form-CntyhRrK.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CrlZlNoj.js.map → deployment-form-CntyhRrK.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js → deployment-links-DBUSCaxB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-D9ZR_vmp.js.map → deployment-links-DBUSCaxB.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js → deployment._id-BXanVFA8.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-DvHhx-qN.js.map → deployment._id-BXanVFA8.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js → deployment._id-Q5cvHMX9.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-BV0rSqba.js.map → deployment._id-Q5cvHMX9.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-BrEOenqP.js.map → deployment_._id.duplicate-DB-4hHHc.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-BbYKPK42.js.map → deployment_._id.edit-CWf1RIGy.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js → deployment_._id.run-CoHGXFoM.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-Dv7S_MJR.js.map → deployment_._id.run-CoHGXFoM.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js → dropdown-menu-CT-s-V7d.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-e0Fqb6aw.js.map → dropdown-menu-CT-s-V7d.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js → event._eventDate._eventId-BITo_GYL.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-Cp4UmGqq.js.map → event._eventDate._eventId-BITo_GYL.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-BrqoR3E2.js.map → flow-run-graph-DxIl6fzW.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js → flow-run._id-Bbm9OpDi.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-BOp38Pbq.js.map → flow-run._id-Bbm9OpDi.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js → flow-run._id-BtSgRDtA.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DJnTDEN_.js.map → flow-run._id-BtSgRDtA.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js → flow-runs-pagination-LrU9Aio8.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bq2ZUzM6.js.map → flow-runs-pagination-LrU9Aio8.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js → flow._id-BJBRokk4.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-eCBL95rg.js.map → flow._id-BJBRokk4.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DNerk3LS.js → form-CVSlEnl8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DNerk3LS.js.map → form-CVSlEnl8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-DwagHBlF.js → header-4plZZheZ.js} +2 -2
- prefect/server/ui-v2/assets/{header-DwagHBlF.js.map → header-4plZZheZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-huSvwxKI.js → header-9rXZ4r39.js} +2 -2
- prefect/server/ui-v2/assets/{header-huSvwxKI.js.map → header-9rXZ4r39.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B0ejRncu.js → header-D3uM8_xM.js} +2 -2
- prefect/server/ui-v2/assets/{header-B0ejRncu.js.map → header-D3uM8_xM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DI2DC5gd.js → index-6OsEYhIi.js} +2 -2
- prefect/server/ui-v2/assets/{index-DI2DC5gd.js.map → index-6OsEYhIi.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BzN9bQeM.js → index-B7xsJ-QH.js} +2 -2
- prefect/server/ui-v2/assets/{index-BzN9bQeM.js.map → index-B7xsJ-QH.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CnIJUujl.js → index-BeoNC2tJ.js} +2 -2
- prefect/server/ui-v2/assets/{index-CnIJUujl.js.map → index-BeoNC2tJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CTnoa3Ho.js → index-BfJLUM7N.js} +2 -2
- prefect/server/ui-v2/assets/{index-CTnoa3Ho.js.map → index-BfJLUM7N.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CWkbSdxY.js → index-Bj0OOguP.js} +2 -2
- prefect/server/ui-v2/assets/{index-CWkbSdxY.js.map → index-Bj0OOguP.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CBhi1P9g.js → index-BlpD74iH.js} +2 -2
- prefect/server/ui-v2/assets/{index-CBhi1P9g.js.map → index-BlpD74iH.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D5RdrxkU.js → index-BvSl3DKP.js} +8 -8
- prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BU4yZRd3.js → index-CDwJvjUM.js} +2 -2
- prefect/server/ui-v2/assets/{index-BU4yZRd3.js.map → index-CDwJvjUM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CRDz4nhM.js → index-CDyLkbVG.js} +2 -2
- prefect/server/ui-v2/assets/{index-CRDz4nhM.js.map → index-CDyLkbVG.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cutg_A1j.js → index-ChIrfjIW.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cutg_A1j.js.map → index-ChIrfjIW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BhALpenO.js → index-CzCSgCK-.js} +2 -2
- prefect/server/ui-v2/assets/{index-BhALpenO.js.map → index-CzCSgCK-.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Dg_duvDx.js → index-D5v9S-lB.js} +2 -2
- prefect/server/ui-v2/assets/{index-Dg_duvDx.js.map → index-D5v9S-lB.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DDiyFpIV.js → index-D6GJ4go1.js} +2 -2
- prefect/server/ui-v2/assets/{index-DDiyFpIV.js.map → index-D6GJ4go1.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-dSUEBAqg.js → index-DJyKqsFO.js} +2 -2
- prefect/server/ui-v2/assets/{index-dSUEBAqg.js.map → index-DJyKqsFO.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BO3SOwdV.js → index-DODEq1Pi.js} +2 -2
- prefect/server/ui-v2/assets/{index-BO3SOwdV.js.map → index-DODEq1Pi.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Dspw5HFj.js → index-DicK6p3K.js} +2 -2
- prefect/server/ui-v2/assets/{index-Dspw5HFj.js.map → index-DicK6p3K.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-VOOLxiSE.js → index-DqCPbST9.js} +2 -2
- prefect/server/ui-v2/assets/{index-VOOLxiSE.js.map → index-DqCPbST9.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BTPE3vs7.js → index-DxPoKag8.js} +2 -2
- prefect/server/ui-v2/assets/{index-BTPE3vs7.js.map → index-DxPoKag8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Wfs7Cjew.js → index-h9-QgNjZ.js} +2 -2
- prefect/server/ui-v2/assets/{index-Wfs7Cjew.js.map → index-h9-QgNjZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-uvH5a3zO.js → index-tBdv6kBF.js} +2 -2
- prefect/server/ui-v2/assets/{index-uvH5a3zO.js.map → index-tBdv6kBF.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CgOsOj5t.js → index-udb79rgq.js} +2 -2
- prefect/server/ui-v2/assets/{index-CgOsOj5t.js.map → index-udb79rgq.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js → json-input-Dt1icmrn.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-gXz7BuJj.js.map → json-input-Dt1icmrn.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js → key._key-Cyh5MBX_.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CJPbLXwU.js.map → key._key-Cyh5MBX_.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js → lazy-markdown-BwIwKFRF.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-wPid80zf.js.map → lazy-markdown-BwIwKFRF.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-DC63bGXK.js → login-DKXFVSwk.js} +2 -2
- prefect/server/ui-v2/assets/{login-DC63bGXK.js.map → login-DKXFVSwk.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js → markdown-input-Dp0mBlkV.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-BhqrU6Eo.js.map → markdown-input-Dp0mBlkV.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js → python-example-snippet-BYwPjHI5.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-3jtXWQZN.js.map → python-example-snippet-BYwPjHI5.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-ZVi-v324.js → python-input-y26XMqXw.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-ZVi-v324.js.map → python-input-y26XMqXw.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js → radio-group-D0van45v.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-BBMLpHGc.js.map → radio-group-D0van45v.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js → route-error-state-CGGpuCGN.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-BJXl8qkX.js.map → route-error-state-CGGpuCGN.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js → schema-form-2tg5SXM4.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-BEqYjsM-.js.map → schema-form-2tg5SXM4.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js → schema-form-input-string-format-datetime-CZt6AJ4z.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-l3xt3PWf.js.map → schema-form-input-string-format-datetime-CZt6AJ4z.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-txD0dR5Q.js → settings-DDUadk_N.js} +2 -2
- prefect/server/ui-v2/assets/{settings-txD0dR5Q.js.map → settings-DDUadk_N.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js → sort-filter-D9p3cPx9.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DHPFdKZ2.js.map → sort-filter-D9p3cPx9.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-ULfpXJXB.js → table-vo9Do8sA.js} +2 -2
- prefect/server/ui-v2/assets/{table-ULfpXJXB.js.map → table-vo9Do8sA.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js → tags-input-Ci2JQ-k3.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BLzMOTDb.js.map → tags-input-Ci2JQ-k3.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js → task-run._id-CjevSs79.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CkOl9MJs.js.map → task-run._id-CjevSs79.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js → task-run._id-D8QKG5UZ.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-udkz1lhh.js.map → task-run._id-D8QKG5UZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js → task-runs-pagination-CifoSGct.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-pagination-B7D5K_FM.js.map → task-runs-pagination-CifoSGct.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js → textarea-BAtfAxtV.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-C4bdj7Jk.js.map → textarea-BAtfAxtV.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js → timezone-select-QlQTZSsF.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-AdlSRQxZ.js.map → timezone-select-QlQTZSsF.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js → toggle-group-BJN1vjEh.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-C-vxYz4l.js.map → toggle-group-BJN1vjEh.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js → use-delete-automation-confirmation-dialog-eOWJYPkD.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map → use-delete-automation-confirmation-dialog-eOWJYPkD.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js → use-delete-block-document-confirmation-dialog-BTwSeHRM.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map → use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js → use-flow-runs-selected-rows-BL_Gv9CC.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DfwmswyR.js.map → use-flow-runs-selected-rows-BL_Gv9CC.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js → use-get-artifacts-flow-task-runs-TSCoomjQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BEBpG_5J.js.map → use-get-artifacts-flow-task-runs-TSCoomjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js → use-quick-run-BMnCkwSv.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-BYBRcDwC.js.map → use-quick-run-BMnCkwSv.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js → use-stepper-C1wm66U2.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-Bk97vOTm.js.map → use-stepper-C1wm66U2.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js → utilities-DxRXxFOF.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-BQwGFLk5.js.map → utilities-DxRXxFOF.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js → work-pool-filter-PudrkZYj.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-Ddhp_M-L.js.map → work-pool-filter-PudrkZYj.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js → work-pool-queue-toggle-BAOrV_0R.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-DX3eV3R_.js.map → work-pool-queue-toggle-BAOrV_0R.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js → work-pool._workPoolName-BOM3849e.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-BaRIsXBX.js.map → work-pool._workPoolName-BOM3849e.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js → work-pool_._workPoolName.edit-CIhcG6yr.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-dhS_Xz32.js.map → work-pool_._workPoolName.edit-CIhcG6yr.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js → work-queue-icon-text-CP4yX3uM.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-_Ez8e2dw.js.map → work-queue-icon-text-CP4yX3uM.js.map} +1 -1
- prefect/server/ui-v2/index.html +1 -1
- prefect/settings/models/flows.py +1 -14
- prefect/settings/models/runner.py +6 -16
- prefect/task_engine.py +3 -1
- prefect/task_worker.py +1 -1
- prefect/tasks.py +2 -2
- prefect/testing/fixtures.py +5 -23
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/METADATA +1 -1
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/RECORD +213 -213
- prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +0 -1
- prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +0 -1
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.13.dist-info → prefect-3.6.13.dev2.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Generated by versioningit
|
|
2
|
-
__version__ = "3.6.13"
|
|
3
|
-
__build_date__ = "2026-01-
|
|
4
|
-
__git_commit__ = "
|
|
2
|
+
__version__ = "3.6.13.dev2"
|
|
3
|
+
__build_date__ = "2026-01-22 08:12:37.989944+00:00"
|
|
4
|
+
__git_commit__ = "3216a18c97baecb25fe70d3d46a93eb56ebd2adc"
|
|
5
5
|
__dirty__ = False
|
|
@@ -4,24 +4,6 @@ from typing import Any, Union
|
|
|
4
4
|
from prefect.filesystems import NullFileSystem, WritableFileSystem
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
def call_explicitly_sync_block_method(
|
|
8
|
-
block: Union[WritableFileSystem, NullFileSystem],
|
|
9
|
-
method: str,
|
|
10
|
-
args: tuple[Any, ...],
|
|
11
|
-
kwargs: dict[str, Any],
|
|
12
|
-
) -> Any:
|
|
13
|
-
"""
|
|
14
|
-
Call a block method synchronously.
|
|
15
|
-
|
|
16
|
-
TODO: remove this once we have explicit sync/async methods on all storage blocks
|
|
17
|
-
|
|
18
|
-
see https://github.com/PrefectHQ/prefect/issues/15008
|
|
19
|
-
"""
|
|
20
|
-
# Pass _sync=True to ensure we get synchronous execution even when called
|
|
21
|
-
# from an async context (e.g., within a sync flow running in an async test)
|
|
22
|
-
return getattr(block, method)(*args, _sync=True, **kwargs)
|
|
23
|
-
|
|
24
|
-
|
|
25
7
|
async def call_explicitly_async_block_method(
|
|
26
8
|
block: Union[WritableFileSystem, NullFileSystem],
|
|
27
9
|
method: str,
|
|
@@ -281,27 +281,6 @@ class FlowRunFilterIdempotencyKey(PrefectBaseModel):
|
|
|
281
281
|
)
|
|
282
282
|
|
|
283
283
|
|
|
284
|
-
class FlowRunFilterCreatedBy(PrefectBaseModel, OperatorMixin):
|
|
285
|
-
"""Filter by `FlowRun.created_by`."""
|
|
286
|
-
|
|
287
|
-
id_: Optional[List[UUID]] = Field(
|
|
288
|
-
default=None,
|
|
289
|
-
description="A list of creator IDs to include",
|
|
290
|
-
)
|
|
291
|
-
type_: Optional[List[str]] = Field(
|
|
292
|
-
default=None,
|
|
293
|
-
description=(
|
|
294
|
-
"A list of creator types to include. For example, 'DEPLOYMENT' for "
|
|
295
|
-
"scheduled runs or 'AUTOMATION' for runs triggered by automations."
|
|
296
|
-
),
|
|
297
|
-
examples=[["DEPLOYMENT", "AUTOMATION"]],
|
|
298
|
-
)
|
|
299
|
-
is_null_: Optional[bool] = Field(
|
|
300
|
-
default=None,
|
|
301
|
-
description="If true, only include flow runs without a creator",
|
|
302
|
-
)
|
|
303
|
-
|
|
304
|
-
|
|
305
284
|
class FlowRunFilter(PrefectBaseModel, OperatorMixin):
|
|
306
285
|
"""Filter flow runs. Only flow runs matching all criteria will be returned"""
|
|
307
286
|
|
|
@@ -345,9 +324,6 @@ class FlowRunFilter(PrefectBaseModel, OperatorMixin):
|
|
|
345
324
|
idempotency_key: Optional[FlowRunFilterIdempotencyKey] = Field(
|
|
346
325
|
default=None, description="Filter criteria for `FlowRun.idempotency_key`"
|
|
347
326
|
)
|
|
348
|
-
created_by: Optional[FlowRunFilterCreatedBy] = Field(
|
|
349
|
-
default=None, description="Filter criteria for `FlowRun.created_by`"
|
|
350
|
-
)
|
|
351
327
|
|
|
352
328
|
|
|
353
329
|
class TaskRunFilterFlowRunId(PrefectBaseModel):
|
prefect/flow_engine.py
CHANGED
|
@@ -5,7 +5,6 @@ import logging
|
|
|
5
5
|
import multiprocessing
|
|
6
6
|
import multiprocessing.context
|
|
7
7
|
import os
|
|
8
|
-
import threading
|
|
9
8
|
import time
|
|
10
9
|
from contextlib import (
|
|
11
10
|
AsyncExitStack,
|
|
@@ -37,7 +36,7 @@ from anyio import CancelScope
|
|
|
37
36
|
from opentelemetry import propagate, trace
|
|
38
37
|
from typing_extensions import ParamSpec
|
|
39
38
|
|
|
40
|
-
from prefect import Task
|
|
39
|
+
from prefect import Task
|
|
41
40
|
from prefect.client.orchestration import PrefectClient, SyncPrefectClient, get_client
|
|
42
41
|
from prefect.client.schemas import FlowRun, TaskRun
|
|
43
42
|
from prefect.client.schemas.filters import FlowRunFilter
|
|
@@ -61,8 +60,6 @@ from prefect.context import (
|
|
|
61
60
|
serialize_context,
|
|
62
61
|
)
|
|
63
62
|
from prefect.engine import handle_engine_signals
|
|
64
|
-
from prefect.events.related import RelatedResource, tags_as_related_resources
|
|
65
|
-
from prefect.events.utilities import emit_event
|
|
66
63
|
from prefect.exceptions import (
|
|
67
64
|
Abort,
|
|
68
65
|
MissingFlowError,
|
|
@@ -164,129 +161,6 @@ def load_flow_and_flow_run(flow_run_id: UUID) -> tuple[FlowRun, Flow[..., Any]]:
|
|
|
164
161
|
return flow_run, flow
|
|
165
162
|
|
|
166
163
|
|
|
167
|
-
@contextmanager
|
|
168
|
-
def send_heartbeats_sync(
|
|
169
|
-
engine: "FlowRunEngine[Any, Any]",
|
|
170
|
-
) -> Generator[None, None, None]:
|
|
171
|
-
"""Context manager that maintains heartbeats for a sync flow run.
|
|
172
|
-
|
|
173
|
-
Heartbeats are emitted at regular intervals while the flow is running.
|
|
174
|
-
The loop checks the flow run state before each heartbeat and stops
|
|
175
|
-
if the run reaches a terminal state.
|
|
176
|
-
|
|
177
|
-
Args:
|
|
178
|
-
engine: The FlowRunEngine instance to emit heartbeats for.
|
|
179
|
-
|
|
180
|
-
Yields:
|
|
181
|
-
None
|
|
182
|
-
"""
|
|
183
|
-
heartbeat_seconds = engine.heartbeat_seconds
|
|
184
|
-
if heartbeat_seconds is None:
|
|
185
|
-
yield
|
|
186
|
-
return
|
|
187
|
-
|
|
188
|
-
stop_event = threading.Event()
|
|
189
|
-
|
|
190
|
-
def heartbeat_loop() -> None:
|
|
191
|
-
while not stop_event.is_set():
|
|
192
|
-
# Check state before emitting - don't emit if final
|
|
193
|
-
if (
|
|
194
|
-
engine.flow_run
|
|
195
|
-
and engine.flow_run.state
|
|
196
|
-
and engine.flow_run.state.is_final()
|
|
197
|
-
):
|
|
198
|
-
engine.logger.debug("Flow run in terminal state, stopping heartbeat")
|
|
199
|
-
return
|
|
200
|
-
|
|
201
|
-
try:
|
|
202
|
-
engine._emit_flow_run_heartbeat()
|
|
203
|
-
except Exception:
|
|
204
|
-
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
205
|
-
|
|
206
|
-
# Sleep in increments to allow quick shutdown
|
|
207
|
-
for _ in range(heartbeat_seconds):
|
|
208
|
-
if stop_event.is_set():
|
|
209
|
-
return
|
|
210
|
-
time.sleep(1)
|
|
211
|
-
|
|
212
|
-
thread = threading.Thread(target=heartbeat_loop, daemon=True)
|
|
213
|
-
thread.start()
|
|
214
|
-
engine.logger.debug("Started flow run heartbeat context")
|
|
215
|
-
|
|
216
|
-
try:
|
|
217
|
-
yield
|
|
218
|
-
finally:
|
|
219
|
-
stop_event.set()
|
|
220
|
-
thread.join(timeout=2)
|
|
221
|
-
engine.logger.debug("Stopped flow run heartbeat context")
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
@asynccontextmanager
|
|
225
|
-
async def send_heartbeats_async(
|
|
226
|
-
engine: "AsyncFlowRunEngine[Any, Any]",
|
|
227
|
-
) -> AsyncGenerator[None, None]:
|
|
228
|
-
"""Async context manager that maintains heartbeats for an async flow run.
|
|
229
|
-
|
|
230
|
-
Heartbeats are emitted at regular intervals while the flow is running.
|
|
231
|
-
The loop checks the flow run state before each heartbeat and stops
|
|
232
|
-
if the run reaches a terminal state.
|
|
233
|
-
|
|
234
|
-
Args:
|
|
235
|
-
engine: The AsyncFlowRunEngine instance to emit heartbeats for.
|
|
236
|
-
|
|
237
|
-
Yields:
|
|
238
|
-
None
|
|
239
|
-
"""
|
|
240
|
-
heartbeat_seconds = engine.heartbeat_seconds
|
|
241
|
-
if heartbeat_seconds is None:
|
|
242
|
-
yield
|
|
243
|
-
return
|
|
244
|
-
|
|
245
|
-
stop_flag = False
|
|
246
|
-
|
|
247
|
-
async def heartbeat_loop() -> None:
|
|
248
|
-
nonlocal stop_flag
|
|
249
|
-
try:
|
|
250
|
-
while not stop_flag:
|
|
251
|
-
# Check state before emitting - don't emit if final
|
|
252
|
-
if (
|
|
253
|
-
engine.flow_run
|
|
254
|
-
and engine.flow_run.state
|
|
255
|
-
and engine.flow_run.state.is_final()
|
|
256
|
-
):
|
|
257
|
-
engine.logger.debug(
|
|
258
|
-
"Flow run in terminal state, stopping heartbeat"
|
|
259
|
-
)
|
|
260
|
-
return
|
|
261
|
-
|
|
262
|
-
try:
|
|
263
|
-
engine._emit_flow_run_heartbeat()
|
|
264
|
-
except Exception:
|
|
265
|
-
engine.logger.debug("Failed to emit heartbeat", exc_info=True)
|
|
266
|
-
|
|
267
|
-
# Sleep in increments to allow quick shutdown (parity with sync version)
|
|
268
|
-
for _ in range(heartbeat_seconds):
|
|
269
|
-
if stop_flag:
|
|
270
|
-
return
|
|
271
|
-
await asyncio.sleep(1)
|
|
272
|
-
except asyncio.CancelledError:
|
|
273
|
-
engine.logger.debug("Heartbeat loop cancelled")
|
|
274
|
-
|
|
275
|
-
task = asyncio.create_task(heartbeat_loop())
|
|
276
|
-
engine.logger.debug("Started flow run heartbeat context")
|
|
277
|
-
|
|
278
|
-
try:
|
|
279
|
-
yield
|
|
280
|
-
finally:
|
|
281
|
-
stop_flag = True
|
|
282
|
-
task.cancel()
|
|
283
|
-
try:
|
|
284
|
-
await task
|
|
285
|
-
except asyncio.CancelledError:
|
|
286
|
-
pass
|
|
287
|
-
engine.logger.debug("Stopped flow run heartbeat context")
|
|
288
|
-
|
|
289
|
-
|
|
290
164
|
@dataclass
|
|
291
165
|
class BaseFlowRunEngine(Generic[P, R]):
|
|
292
166
|
flow: Union[Flow[P, R], Flow[P, Coroutine[Any, Any, R]]]
|
|
@@ -326,59 +200,10 @@ class BaseFlowRunEngine(Generic[P, R]):
|
|
|
326
200
|
return False # TODO: handle this differently?
|
|
327
201
|
return getattr(self, "flow_run").state.is_pending()
|
|
328
202
|
|
|
329
|
-
@property
|
|
330
|
-
def heartbeat_seconds(self) -> Optional[int]:
|
|
331
|
-
"""Get the heartbeat interval from settings."""
|
|
332
|
-
return get_current_settings().flows.heartbeat_frequency
|
|
333
|
-
|
|
334
203
|
def cancel_all_tasks(self) -> None:
|
|
335
204
|
if hasattr(self.flow.task_runner, "cancel_all"):
|
|
336
205
|
self.flow.task_runner.cancel_all() # type: ignore
|
|
337
206
|
|
|
338
|
-
def _emit_flow_run_heartbeat(self) -> None:
|
|
339
|
-
"""Emit a heartbeat event for the current flow run."""
|
|
340
|
-
if not self.flow_run:
|
|
341
|
-
return
|
|
342
|
-
|
|
343
|
-
related: list[RelatedResource] = []
|
|
344
|
-
tags: list[str] = list(self.flow_run.tags or [])
|
|
345
|
-
|
|
346
|
-
# Add flow as related resource using flow_id for consistency with other events
|
|
347
|
-
if self.flow_run.flow_id:
|
|
348
|
-
related.append(
|
|
349
|
-
RelatedResource.model_validate(
|
|
350
|
-
{
|
|
351
|
-
"prefect.resource.id": f"prefect.flow.{self.flow_run.flow_id}",
|
|
352
|
-
"prefect.resource.role": "flow",
|
|
353
|
-
"prefect.resource.name": self.flow.name if self.flow else "",
|
|
354
|
-
}
|
|
355
|
-
)
|
|
356
|
-
)
|
|
357
|
-
|
|
358
|
-
# Add deployment as related resource if available
|
|
359
|
-
# Note: deployment name is not available on flow_run without an API call
|
|
360
|
-
if self.flow_run.deployment_id:
|
|
361
|
-
related.append(
|
|
362
|
-
RelatedResource.model_validate(
|
|
363
|
-
{
|
|
364
|
-
"prefect.resource.id": f"prefect.deployment.{self.flow_run.deployment_id}",
|
|
365
|
-
"prefect.resource.role": "deployment",
|
|
366
|
-
}
|
|
367
|
-
)
|
|
368
|
-
)
|
|
369
|
-
|
|
370
|
-
related += tags_as_related_resources(set(tags))
|
|
371
|
-
|
|
372
|
-
emit_event(
|
|
373
|
-
event="prefect.flow-run.heartbeat",
|
|
374
|
-
resource={
|
|
375
|
-
"prefect.resource.id": f"prefect.flow-run.{self.flow_run.id}",
|
|
376
|
-
"prefect.resource.name": self.flow_run.name or "",
|
|
377
|
-
"prefect.version": __version__,
|
|
378
|
-
},
|
|
379
|
-
related=related,
|
|
380
|
-
)
|
|
381
|
-
|
|
382
207
|
def _update_otel_labels(
|
|
383
208
|
self, span: trace.Span, client: Union[SyncPrefectClient, PrefectClient]
|
|
384
209
|
):
|
|
@@ -518,7 +343,6 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
518
343
|
|
|
519
344
|
self._telemetry.update_state(state)
|
|
520
345
|
self.call_hooks(state)
|
|
521
|
-
|
|
522
346
|
return state
|
|
523
347
|
|
|
524
348
|
def result(self, raise_on_failure: bool = True) -> "Union[R, State, None]":
|
|
@@ -967,11 +791,10 @@ class FlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
967
791
|
seconds=self.flow.timeout_seconds,
|
|
968
792
|
timeout_exc_type=FlowRunTimeoutError,
|
|
969
793
|
):
|
|
970
|
-
|
|
971
|
-
self.
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
yield self
|
|
794
|
+
self.logger.debug(
|
|
795
|
+
f"Executing flow {self.flow.name!r} for flow run {self.flow_run.name!r}..."
|
|
796
|
+
)
|
|
797
|
+
yield self
|
|
975
798
|
except TimeoutError as exc:
|
|
976
799
|
self.handle_timeout(exc)
|
|
977
800
|
except Exception as exc:
|
|
@@ -1107,7 +930,6 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1107
930
|
|
|
1108
931
|
self._telemetry.update_state(state)
|
|
1109
932
|
await self.call_hooks(state)
|
|
1110
|
-
|
|
1111
933
|
return state
|
|
1112
934
|
|
|
1113
935
|
async def result(self, raise_on_failure: bool = True) -> "Union[R, State, None]":
|
|
@@ -1559,11 +1381,10 @@ class AsyncFlowRunEngine(BaseFlowRunEngine[P, R]):
|
|
|
1559
1381
|
seconds=self.flow.timeout_seconds,
|
|
1560
1382
|
timeout_exc_type=FlowRunTimeoutError,
|
|
1561
1383
|
):
|
|
1562
|
-
|
|
1563
|
-
self.
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
yield self
|
|
1384
|
+
self.logger.debug(
|
|
1385
|
+
f"Executing flow {self.flow.name!r} for flow run {self.flow_run.name!r}..."
|
|
1386
|
+
)
|
|
1387
|
+
yield self
|
|
1567
1388
|
except TimeoutError as exc:
|
|
1568
1389
|
await self.handle_timeout(exc)
|
|
1569
1390
|
except Exception as exc:
|
|
@@ -1793,7 +1614,6 @@ def run_flow_in_subprocess(
|
|
|
1793
1614
|
parameters: dict[str, Any] | None = None,
|
|
1794
1615
|
wait_for: Iterable[PrefectFuture[Any]] | None = None,
|
|
1795
1616
|
context: dict[str, Any] | None = None,
|
|
1796
|
-
env: dict[str, str] | None = None,
|
|
1797
1617
|
) -> multiprocessing.context.SpawnProcess:
|
|
1798
1618
|
"""
|
|
1799
1619
|
Run a flow in a subprocess.
|
|
@@ -1810,7 +1630,6 @@ def run_flow_in_subprocess(
|
|
|
1810
1630
|
the current context will be used. A serialized context should be provided if
|
|
1811
1631
|
this function is called in a separate memory space from the parent run (e.g.
|
|
1812
1632
|
in a subprocess or on another machine).
|
|
1813
|
-
env: Additional environment variables to set in the subprocess.
|
|
1814
1633
|
|
|
1815
1634
|
Returns:
|
|
1816
1635
|
A multiprocessing.context.SpawnProcess representing the process that is running the flow.
|
|
@@ -1853,8 +1672,7 @@ def run_flow_in_subprocess(
|
|
|
1853
1672
|
| {
|
|
1854
1673
|
# TODO: make this a thing we can pass into the engine
|
|
1855
1674
|
"PREFECT__ENABLE_CANCELLATION_AND_CRASHED_HOOKS": "false",
|
|
1856
|
-
}
|
|
1857
|
-
| (env or {}),
|
|
1675
|
+
},
|
|
1858
1676
|
flow=flow,
|
|
1859
1677
|
flow_run=flow_run,
|
|
1860
1678
|
parameters=parameters,
|
prefect/flows.py
CHANGED
|
@@ -1717,7 +1717,8 @@ class Flow(Generic[P, R]):
|
|
|
1717
1717
|
return_type=return_type,
|
|
1718
1718
|
)
|
|
1719
1719
|
|
|
1720
|
-
|
|
1720
|
+
@sync_compatible
|
|
1721
|
+
async def visualize(self, *args: "P.args", **kwargs: "P.kwargs"):
|
|
1721
1722
|
"""
|
|
1722
1723
|
Generates a graphviz object representing the current flow. In IPython notebooks,
|
|
1723
1724
|
it's rendered inline, otherwise in a new window as a PNG.
|
|
@@ -1775,66 +1776,6 @@ class Flow(Generic[P, R]):
|
|
|
1775
1776
|
new_exception.__traceback__ = e.__traceback__
|
|
1776
1777
|
raise new_exception
|
|
1777
1778
|
|
|
1778
|
-
@async_dispatch(avisualize)
|
|
1779
|
-
def visualize(self, *args: "P.args", **kwargs: "P.kwargs") -> None:
|
|
1780
|
-
"""
|
|
1781
|
-
Generates a graphviz object representing the current flow. In IPython notebooks,
|
|
1782
|
-
it's rendered inline, otherwise in a new window as a PNG.
|
|
1783
|
-
|
|
1784
|
-
Raises:
|
|
1785
|
-
- ImportError: If `graphviz` isn't installed.
|
|
1786
|
-
- GraphvizExecutableNotFoundError: If the `dot` executable isn't found.
|
|
1787
|
-
- FlowVisualizationError: If the flow can't be visualized for any other reason.
|
|
1788
|
-
"""
|
|
1789
|
-
from prefect.utilities.visualization import (
|
|
1790
|
-
FlowVisualizationError,
|
|
1791
|
-
GraphvizExecutableNotFoundError,
|
|
1792
|
-
GraphvizImportError,
|
|
1793
|
-
TaskVizTracker,
|
|
1794
|
-
VisualizationUnsupportedError,
|
|
1795
|
-
build_task_dependencies,
|
|
1796
|
-
visualize_task_dependencies,
|
|
1797
|
-
)
|
|
1798
|
-
|
|
1799
|
-
if not PREFECT_TESTING_UNIT_TEST_MODE:
|
|
1800
|
-
warnings.warn(
|
|
1801
|
-
"`flow.visualize()` will execute code inside of your flow that is not"
|
|
1802
|
-
" decorated with `@task` or `@flow`."
|
|
1803
|
-
)
|
|
1804
|
-
|
|
1805
|
-
try:
|
|
1806
|
-
with TaskVizTracker() as tracker:
|
|
1807
|
-
if self.isasync:
|
|
1808
|
-
# Run async flow via event loop
|
|
1809
|
-
run_coro_as_sync(self.fn(*args, **kwargs))
|
|
1810
|
-
else:
|
|
1811
|
-
self.fn(*args, **kwargs)
|
|
1812
|
-
|
|
1813
|
-
graph = build_task_dependencies(tracker)
|
|
1814
|
-
|
|
1815
|
-
visualize_task_dependencies(graph, self.name)
|
|
1816
|
-
|
|
1817
|
-
except GraphvizImportError:
|
|
1818
|
-
raise
|
|
1819
|
-
except GraphvizExecutableNotFoundError:
|
|
1820
|
-
raise
|
|
1821
|
-
except VisualizationUnsupportedError:
|
|
1822
|
-
raise
|
|
1823
|
-
except FlowVisualizationError:
|
|
1824
|
-
raise
|
|
1825
|
-
except Exception as e:
|
|
1826
|
-
msg = (
|
|
1827
|
-
"It's possible you are trying to visualize a flow that contains "
|
|
1828
|
-
"code that directly interacts with the result of a task"
|
|
1829
|
-
" inside of the flow. \nTry passing a `viz_return_value` "
|
|
1830
|
-
"to the task decorator, e.g. `@task(viz_return_value=[1, 2, 3]).`"
|
|
1831
|
-
)
|
|
1832
|
-
|
|
1833
|
-
new_exception = type(e)(str(e) + "\n" + msg)
|
|
1834
|
-
# Copy traceback information from the original exception
|
|
1835
|
-
new_exception.__traceback__ = e.__traceback__
|
|
1836
|
-
raise new_exception
|
|
1837
|
-
|
|
1838
1779
|
|
|
1839
1780
|
class FlowDecorator:
|
|
1840
1781
|
@overload
|