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.
- prefect/_build_info.py +3 -3
- prefect/_internal/compatibility/blocks.py +18 -0
- prefect/_internal/urls.py +29 -0
- prefect/_states.py +4 -1
- prefect/client/orchestration/_concurrency_limits/client.py +16 -16
- prefect/client/schemas/filters.py +24 -0
- prefect/client/subscriptions.py +1 -1
- prefect/events/clients.py +52 -13
- prefect/flow_engine.py +192 -10
- prefect/flows.py +61 -2
- prefect/results.py +262 -21
- prefect/runner/runner.py +29 -82
- prefect/runner/storage.py +6 -25
- prefect/server/schemas/filters.py +45 -0
- prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-CUEaRDGw.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-CUEaRDGw.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-Ca6VCUS0.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-Ca6VCUS0.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-z26pICBl.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-z26pICBl.js.map} +1 -1
- prefect/server/ui-v2/assets/automation._id-DuodjY5t.js +2 -0
- prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-DuodjY5t.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-CcuJhc-y.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-CcuJhc-y.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-CgOWwuc6.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-CgOWwuc6.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-DN9HyjM5.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-DN9HyjM5.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-rrToxL5r.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-rrToxL5r.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-DURScH8H.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-Bue6lnrN.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-Bue6lnrN.js.map} +1 -1
- prefect/server/ui-v2/assets/block_._id.edit-QY0OzN_b.js +2 -0
- prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-QY0OzN_b.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog-CGjRGWv6.js +2 -0
- prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-CGjRGWv6.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug-BMFNZhEb.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-BMFNZhEb.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug_.create-CuFA3kUC.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-CuFA3kUC.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-Ell2FjrX.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-Ell2FjrX.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-Rr1ysUct.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-Rr1ysUct.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-noFojqGL.js → create-CQK8-uO1.js} +2 -2
- prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-CQK8-uO1.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-ewA3uq_h.js} +2 -2
- prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-ewA3uq_h.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bx1uYX_M.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bx1uYX_M.js.map} +1 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-CqKsUEj_.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CqKsUEj_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-Bz5COdER.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-Bz5COdER.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CrlZlNoj.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CrlZlNoj.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-D9ZR_vmp.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-D9ZR_vmp.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment._id-BV0rSqba.js +2 -0
- prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-BV0rSqba.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-DvHhx-qN.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-DvHhx-qN.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-BrEOenqP.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-BbYKPK42.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-Dv7S_MJR.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-Dv7S_MJR.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-e0Fqb6aw.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-e0Fqb6aw.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-Cp4UmGqq.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-Cp4UmGqq.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +2 -0
- prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-BOp38Pbq.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-BOp38Pbq.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-DJnTDEN_.js +2 -0
- prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-DJnTDEN_.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +1 -0
- prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js +2 -0
- prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js.map +1 -0
- prefect/server/ui-v2/assets/flow._id-eCBL95rg.js +2 -0
- prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-eCBL95rg.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-DNerk3LS.js} +2 -2
- prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-DNerk3LS.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-B0ejRncu.js} +2 -2
- prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-B0ejRncu.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-DwagHBlF.js} +2 -2
- prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-DwagHBlF.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B75eb688.js → header-huSvwxKI.js} +2 -2
- prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-huSvwxKI.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-BO3SOwdV.js} +2 -2
- prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-BO3SOwdV.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-BTPE3vs7.js} +2 -2
- prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-BTPE3vs7.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BU4yZRd3.js +2 -0
- prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-BU4yZRd3.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BhALpenO.js +2 -0
- prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-BhALpenO.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BzN9bQeM.js +2 -0
- prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-BzN9bQeM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-CBhi1P9g.js} +2 -2
- prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-CBhi1P9g.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CRDz4nhM.js} +2 -2
- prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CRDz4nhM.js.map} +1 -1
- prefect/server/ui-v2/assets/index-CTnoa3Ho.js +2 -0
- prefect/server/ui-v2/assets/index-CTnoa3Ho.js.map +1 -0
- prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-CWkbSdxY.js} +2 -2
- prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-CWkbSdxY.js.map} +1 -1
- prefect/server/ui-v2/assets/index-CgOsOj5t.js +2 -0
- prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-CgOsOj5t.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-CnIJUujl.js} +2 -2
- prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-CnIJUujl.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-Cutg_A1j.js} +2 -2
- prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-Cutg_A1j.js.map} +1 -1
- prefect/server/ui-v2/assets/index-D5RdrxkU.js +17 -0
- prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +1 -0
- prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-DDiyFpIV.js} +2 -2
- prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-DDiyFpIV.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-DI2DC5gd.js} +2 -2
- prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-DI2DC5gd.js.map} +1 -1
- prefect/server/ui-v2/assets/index-Dg_duvDx.js +2 -0
- prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-Dg_duvDx.js.map} +1 -1
- prefect/server/ui-v2/assets/index-Dspw5HFj.js +2 -0
- prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-Dspw5HFj.js.map} +1 -1
- prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
- prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-VOOLxiSE.js} +2 -2
- prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-VOOLxiSE.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-Wfs7Cjew.js} +2 -2
- prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-Wfs7Cjew.js.map} +1 -1
- prefect/server/ui-v2/assets/index-dSUEBAqg.js +2 -0
- prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-dSUEBAqg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-uvH5a3zO.js} +2 -2
- prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-uvH5a3zO.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-gXz7BuJj.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-gXz7BuJj.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-CJPbLXwU.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-CJPbLXwU.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-wPid80zf.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-wPid80zf.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DC63bGXK.js} +2 -2
- prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DC63bGXK.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-BhqrU6Eo.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-BhqrU6Eo.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-3jtXWQZN.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-3jtXWQZN.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-ZVi-v324.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-ZVi-v324.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-BBMLpHGc.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-BBMLpHGc.js.map} +1 -1
- prefect/server/ui-v2/assets/route-error-state-BJXl8qkX.js +2 -0
- prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-BJXl8qkX.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-BEqYjsM-.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-BEqYjsM-.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-l3xt3PWf.js} +4 -4
- 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
- prefect/server/ui-v2/assets/settings-txD0dR5Q.js +2 -0
- prefect/server/ui-v2/assets/settings-txD0dR5Q.js.map +1 -0
- prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-DHPFdKZ2.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-DHPFdKZ2.js.map} +1 -1
- prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
- prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
- prefect/server/ui-v2/assets/table-ULfpXJXB.js +2 -0
- prefect/server/ui-v2/assets/table-ULfpXJXB.js.map +1 -0
- prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js +2 -0
- prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js.map +1 -0
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-BpeKHk7g.js +2 -0
- 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
- prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CkOl9MJs.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CkOl9MJs.js.map} +1 -1
- prefect/server/ui-v2/assets/task-run._id-udkz1lhh.js +2 -0
- prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-udkz1lhh.js.map} +1 -1
- prefect/server/ui-v2/assets/task-runs-pagination-B7D5K_FM.js +2 -0
- prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-B7D5K_FM.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-C4bdj7Jk.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-C4bdj7Jk.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-AdlSRQxZ.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-AdlSRQxZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-C-vxYz4l.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-C-vxYz4l.js.map} +1 -1
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Cqhaqtqe.js +2 -0
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-GjNhFxZe.js} +2 -2
- 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
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-DfwmswyR.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-DfwmswyR.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-BEBpG_5J.js} +2 -2
- 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
- prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BYBRcDwC.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BYBRcDwC.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-Bk97vOTm.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-Bk97vOTm.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-BQwGFLk5.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-BQwGFLk5.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-Ddhp_M-L.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-Ddhp_M-L.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-DX3eV3R_.js +2 -0
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-DX3eV3R_.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BaRIsXBX.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BaRIsXBX.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-dhS_Xz32.js +2 -0
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-dhS_Xz32.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-_Ez8e2dw.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-_Ez8e2dw.js.map} +1 -1
- prefect/server/ui-v2/index.html +2 -2
- prefect/settings/models/flows.py +14 -1
- prefect/settings/models/runner.py +16 -6
- prefect/task_engine.py +17 -3
- prefect/task_worker.py +99 -17
- prefect/tasks.py +2 -2
- prefect/testing/fixtures.py +41 -6
- {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/METADATA +1 -1
- {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/RECORD +221 -220
- prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
- prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
- prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
- prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
- prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
- prefect/server/ui-v2/assets/delete-confirmation-dialog-COdZmNfa.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
- prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
- prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
- prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
- prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
- prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
- prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
- prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
- prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
- prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
- prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
- prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
- prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
- prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
- prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
- prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
- prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
- prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
- prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
- prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
- prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
- prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
- prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
- prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
- prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
- prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
- prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
- prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
- prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
- {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/WHEEL +0 -0
- {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/entry_points.txt +0 -0
- {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
|
|
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.
|
|
173
|
+
from_sync.call_in_loop_thread(create_call(self.astop))
|
|
173
174
|
|
|
174
175
|
sys.exit(0)
|
|
175
176
|
|
|
176
|
-
|
|
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
|
-
@
|
|
207
|
-
|
|
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
|
-
).
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
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
|
-
).
|
|
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
|
-
).
|
|
1027
|
+
).aupdate_for_task(self)
|
|
1028
1028
|
context = serialize_context()
|
|
1029
1029
|
data: dict[str, Any] = {"context": context}
|
|
1030
1030
|
if parameters:
|
prefect/testing/fixtures.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|