prefect-client 3.0.0rc10__tar.gz → 3.0.0rc12__tar.gz

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 (205) hide show
  1. {prefect-client-3.0.0rc10/src/prefect_client.egg-info → prefect-client-3.0.0rc12}/PKG-INFO +1 -1
  2. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/requirements-client.txt +3 -3
  3. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/requirements-dev.txt +2 -2
  4. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/api.py +1 -1
  5. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/services.py +9 -0
  6. prefect-client-3.0.0rc12/src/prefect/_internal/retries.py +61 -0
  7. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/artifacts.py +12 -0
  8. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/cloud.py +1 -1
  9. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/actions.py +4 -0
  10. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/objects.py +1 -1
  11. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/concurrency/asyncio.py +3 -3
  12. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/concurrency/events.py +1 -1
  13. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/concurrency/services.py +3 -2
  14. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/concurrency/sync.py +19 -5
  15. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/context.py +8 -2
  16. prefect-client-3.0.0rc12/src/prefect/deployments/__init__.py +33 -0
  17. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/steps/pull.py +7 -0
  18. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/schemas/events.py +10 -0
  19. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/flow_engine.py +10 -9
  20. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/flows.py +194 -68
  21. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/futures.py +53 -7
  22. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/loggers.py +1 -1
  23. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/results.py +1 -46
  24. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/runner.py +96 -23
  25. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/server.py +20 -22
  26. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/submit.py +0 -8
  27. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runtime/flow_run.py +38 -3
  28. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/settings.py +9 -30
  29. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/task_engine.py +158 -48
  30. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/task_worker.py +1 -1
  31. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/tasks.py +164 -17
  32. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/transactions.py +2 -15
  33. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/asyncutils.py +13 -9
  34. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/engine.py +34 -1
  35. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/base.py +98 -208
  36. prefect-client-3.0.0rc12/src/prefect/workers/process.py +523 -0
  37. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/server.py +27 -9
  38. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12/src/prefect_client.egg-info}/PKG-INFO +1 -1
  39. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect_client.egg-info/SOURCES.txt +1 -0
  40. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect_client.egg-info/requires.txt +3 -3
  41. prefect-client-3.0.0rc10/src/prefect/deployments/__init__.py +0 -20
  42. prefect-client-3.0.0rc10/src/prefect/workers/process.py +0 -265
  43. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/LICENSE +0 -0
  44. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/MANIFEST.in +0 -0
  45. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/README.md +0 -0
  46. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/requirements.txt +0 -0
  47. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/setup.cfg +0 -0
  48. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/setup.py +0 -0
  49. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/.prefectignore +0 -0
  50. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/__init__.py +0 -0
  51. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/__init__.py +0 -0
  52. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/_logging.py +0 -0
  53. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/compatibility/__init__.py +0 -0
  54. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  55. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/compatibility/experimental.py +0 -0
  56. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/compatibility/migration.py +0 -0
  57. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/__init__.py +0 -0
  58. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/calls.py +0 -0
  59. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  60. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  61. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/inspection.py +0 -0
  62. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/primitives.py +0 -0
  63. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/threads.py +0 -0
  64. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/concurrency/waiters.py +0 -0
  65. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/integrations.py +0 -0
  66. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/__init__.py +0 -0
  67. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/annotations/__init__.py +0 -0
  68. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/annotations/pendulum.py +0 -0
  69. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/schemas.py +0 -0
  70. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  71. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  72. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
  73. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/pytz.py +0 -0
  74. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/schemas/__init__.py +0 -0
  75. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/schemas/bases.py +0 -0
  76. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/schemas/fields.py +0 -0
  77. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/schemas/serializers.py +0 -0
  78. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_internal/schemas/validators.py +0 -0
  79. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/_version.py +0 -0
  80. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/agent.py +0 -0
  81. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/automations.py +0 -0
  82. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/__init__.py +0 -0
  83. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/abstract.py +0 -0
  84. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/core.py +0 -0
  85. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/fields.py +0 -0
  86. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/notifications.py +0 -0
  87. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/redis.py +0 -0
  88. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/system.py +0 -0
  89. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/blocks/webhook.py +0 -0
  90. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/cache_policies.py +0 -0
  91. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/__init__.py +0 -0
  92. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/base.py +0 -0
  93. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/collections.py +0 -0
  94. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/constants.py +0 -0
  95. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/orchestration.py +0 -0
  96. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/__init__.py +0 -0
  97. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/filters.py +0 -0
  98. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/responses.py +0 -0
  99. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/schedules.py +0 -0
  100. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/schemas/sorting.py +0 -0
  101. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/subscriptions.py +0 -0
  102. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/types/__init__.py +0 -0
  103. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  104. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/client/utilities.py +0 -0
  105. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/concurrency/__init__.py +0 -0
  106. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/base.py +0 -0
  107. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/deployments.py +0 -0
  108. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/flow_runs.py +0 -0
  109. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/runner.py +0 -0
  110. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/schedules.py +0 -0
  111. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/steps/__init__.py +0 -0
  112. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/steps/core.py +0 -0
  113. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/deployments/steps/utility.py +0 -0
  114. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/docker/__init__.py +0 -0
  115. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/docker/docker_image.py +0 -0
  116. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/engine.py +0 -0
  117. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/__init__.py +0 -0
  118. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/actions.py +0 -0
  119. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/cli/__init__.py +0 -0
  120. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/cli/automations.py +0 -0
  121. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/clients.py +0 -0
  122. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/filters.py +0 -0
  123. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/related.py +0 -0
  124. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/schemas/__init__.py +0 -0
  125. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/schemas/automations.py +0 -0
  126. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  127. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/schemas/labelling.py +0 -0
  128. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/utilities.py +0 -0
  129. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/events/worker.py +0 -0
  130. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/exceptions.py +0 -0
  131. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/filesystems.py +0 -0
  132. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/flow_runs.py +0 -0
  133. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/__init__.py +0 -0
  134. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/base.py +0 -0
  135. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  136. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  137. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  138. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  139. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  140. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/input/__init__.py +0 -0
  141. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/input/actions.py +0 -0
  142. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/input/run_input.py +0 -0
  143. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/__init__.py +0 -0
  144. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/configuration.py +0 -0
  145. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/filters.py +0 -0
  146. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/formatters.py +0 -0
  147. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/handlers.py +0 -0
  148. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/highlighters.py +0 -0
  149. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/logging/logging.yml +0 -0
  150. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/main.py +0 -0
  151. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/manifests.py +0 -0
  152. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/plugins.py +0 -0
  153. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/profiles.toml +0 -0
  154. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/py.typed +0 -0
  155. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/records/__init__.py +0 -0
  156. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/records/result_store.py +0 -0
  157. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/records/store.py +0 -0
  158. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/__init__.py +0 -0
  159. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/storage.py +0 -0
  160. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runner/utils.py +0 -0
  161. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runtime/__init__.py +0 -0
  162. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runtime/deployment.py +0 -0
  163. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/runtime/task_run.py +0 -0
  164. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/serializers.py +0 -0
  165. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  166. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  167. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/states.py +0 -0
  168. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/task_runners.py +0 -0
  169. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/task_runs.py +0 -0
  170. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/types/__init__.py +0 -0
  171. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/types/entrypoint.py +0 -0
  172. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/__init__.py +0 -0
  173. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/annotations.py +0 -0
  174. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/callables.py +0 -0
  175. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/collections.py +0 -0
  176. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/compat.py +0 -0
  177. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/context.py +0 -0
  178. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/dispatch.py +0 -0
  179. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/dockerutils.py +0 -0
  180. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/filesystem.py +0 -0
  181. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/hashing.py +0 -0
  182. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/importtools.py +0 -0
  183. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/math.py +0 -0
  184. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/names.py +0 -0
  185. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/processutils.py +0 -0
  186. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/pydantic.py +0 -0
  187. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/render_swagger.py +0 -0
  188. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  189. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  190. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/schema_tools/validation.py +0 -0
  191. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/services.py +0 -0
  192. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/slugify.py +0 -0
  193. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/templating.py +0 -0
  194. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/text.py +0 -0
  195. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/timeout.py +0 -0
  196. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/urls.py +0 -0
  197. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/utilities/visualization.py +0 -0
  198. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/variables.py +0 -0
  199. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/__init__.py +0 -0
  200. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/block.py +0 -0
  201. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/cloud.py +0 -0
  202. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect/workers/utilities.py +0 -0
  203. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect_client.egg-info/dependency_links.txt +0 -0
  204. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/src/prefect_client.egg-info/top_level.txt +0 -0
  205. {prefect-client-3.0.0rc10 → prefect-client-3.0.0rc12}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc10
3
+ Version: 3.0.0rc12
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -1,14 +1,14 @@
1
- anyio >= 4.0.0, < 5.0.0
1
+ anyio >= 4.4.0, < 5.0.0
2
2
  asgi-lifespan >= 1.0, < 3.0
3
3
  cachetools >= 5.3, < 6.0
4
4
  cloudpickle >= 2.0, < 4.0
5
5
  coolname >= 1.0.4, < 3.0.0
6
- croniter >= 1.0.12, < 3.0.0
6
+ croniter >= 1.0.12, < 4.0.0
7
7
  exceptiongroup >= 1.0.0
8
8
  fastapi >= 0.111.0, < 1.0.0
9
9
  fsspec >= 2022.5.0
10
10
  graphviz >= 0.20.1
11
- griffe >= 0.20.0
11
+ griffe >= 0.20.0, <0.48.0
12
12
  httpcore >=1.0.5, < 2.0.0
13
13
  httpx[http2] >= 0.23, != 0.23.2
14
14
  importlib_metadata >= 4.4; python_version < '3.10'
@@ -1,7 +1,6 @@
1
1
  ruff
2
2
  cairosvg
3
3
  codespell>=2.2.6
4
- ddtrace
5
4
  ipython
6
5
  jinja2
7
6
  moto >= 5
@@ -12,8 +11,9 @@ pre-commit
12
11
  pluggy >= 1.4.0
13
12
  pytest > 7, < 8 # Datadog's ddtrace does not support pytest 8 yet. See https://github.com/DataDog/dd-trace-py/issues/8220
14
13
  pytest-asyncio >= 0.18.2, != 0.22.0, < 0.23.0 # Cannot override event loop in 0.23.0. See https://github.com/pytest-dev/pytest-asyncio/issues/706 for more details.
15
- pytest-cov
16
14
  pytest-benchmark
15
+ pytest-codspeed
16
+ pytest-cov
17
17
  pytest-env
18
18
  pytest-flakefinder
19
19
  pytest-timeout
@@ -151,7 +151,7 @@ class from_async(_base):
151
151
  __call: Union[Callable[[], T], Call[T]],
152
152
  timeout: Optional[float] = None,
153
153
  done_callbacks: Optional[Iterable[Call]] = None,
154
- ) -> Call[T]:
154
+ ) -> T:
155
155
  call = _cast_to_call(__call)
156
156
  waiter = AsyncWaiter(call=call)
157
157
  for callback in done_callbacks or []:
@@ -151,6 +151,7 @@ class QueueService(abc.ABC, Generic[T]):
151
151
 
152
152
  if item is None:
153
153
  logger.debug("Exiting service %r", self)
154
+ self._queue.task_done()
154
155
  break
155
156
 
156
157
  try:
@@ -164,6 +165,8 @@ class QueueService(abc.ABC, Generic[T]):
164
165
  item,
165
166
  exc_info=log_traceback,
166
167
  )
168
+ finally:
169
+ self._queue.task_done()
167
170
 
168
171
  @abc.abstractmethod
169
172
  async def _handle(self, item: T):
@@ -235,6 +238,12 @@ class QueueService(abc.ABC, Generic[T]):
235
238
  else:
236
239
  return concurrent.futures.wait(futures, timeout=timeout)
237
240
 
241
+ def wait_until_empty(self):
242
+ """
243
+ Wait until the queue is empty and all items have been processed.
244
+ """
245
+ self._queue.join()
246
+
238
247
  @classmethod
239
248
  def instance(cls: Type[Self], *args) -> Self:
240
249
  """
@@ -0,0 +1,61 @@
1
+ import asyncio
2
+ from functools import wraps
3
+ from typing import Any, Callable, Tuple, Type
4
+
5
+ from prefect.logging.loggers import get_logger
6
+ from prefect.utilities.math import clamped_poisson_interval
7
+
8
+ logger = get_logger("retries")
9
+
10
+
11
+ def exponential_backoff_with_jitter(
12
+ attempt: int, base_delay: float, max_delay: float
13
+ ) -> float:
14
+ average_interval = min(base_delay * (2**attempt), max_delay)
15
+ return clamped_poisson_interval(average_interval, clamping_factor=0.3)
16
+
17
+
18
+ def retry_async_fn(
19
+ max_attempts: int = 3,
20
+ backoff_strategy: Callable[
21
+ [int, float, float], float
22
+ ] = exponential_backoff_with_jitter,
23
+ base_delay: float = 1,
24
+ max_delay: float = 10,
25
+ retry_on_exceptions: Tuple[Type[Exception], ...] = (Exception,),
26
+ ):
27
+ """A decorator for retrying an async function.
28
+
29
+ Args:
30
+ max_attempts: The maximum number of times to retry the function.
31
+ backoff_strategy: A function that takes in the number of attempts, the base
32
+ delay, and the maximum delay, and returns the delay to use for the next
33
+ attempt. Defaults to an exponential backoff with jitter.
34
+ base_delay: The base delay to use for the first attempt.
35
+ max_delay: The maximum delay to use for the last attempt.
36
+ retry_on_exceptions: A tuple of exception types to retry on. Defaults to
37
+ retrying on all exceptions.
38
+ """
39
+
40
+ def decorator(func):
41
+ @wraps(func)
42
+ async def wrapper(*args: Any, **kwargs: Any) -> Any:
43
+ for attempt in range(max_attempts):
44
+ try:
45
+ return await func(*args, **kwargs)
46
+ except retry_on_exceptions as e:
47
+ if attempt == max_attempts - 1:
48
+ logger.exception(
49
+ f"Function {func.__name__!r} failed after {max_attempts} attempts"
50
+ )
51
+ raise
52
+ delay = backoff_strategy(attempt, base_delay, max_delay)
53
+ logger.warning(
54
+ f"Attempt {attempt + 1} of function {func.__name__!r} failed with {type(e).__name__}. "
55
+ f"Retrying in {delay:.2f} seconds..."
56
+ )
57
+ await asyncio.sleep(delay)
58
+
59
+ return wrapper
60
+
61
+ return decorator
@@ -6,6 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  import json # noqa: I001
8
8
  import math
9
+ import warnings
9
10
  from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
10
11
  from uuid import UUID
11
12
 
@@ -54,8 +55,19 @@ class Artifact(ArtifactRequest):
54
55
  Returns:
55
56
  - The created artifact.
56
57
  """
58
+ from prefect.context import MissingContextError, get_run_context
59
+
57
60
  client, _ = get_or_create_client(client)
58
61
  task_run_id, flow_run_id = get_task_and_flow_run_ids()
62
+
63
+ try:
64
+ get_run_context()
65
+ except MissingContextError:
66
+ warnings.warn(
67
+ "Artifact creation outside of a flow or task run is deprecated and will be removed in a later version.",
68
+ FutureWarning,
69
+ )
70
+
59
71
  return await client.create_artifact(
60
72
  artifact=ArtifactRequest(
61
73
  type=self.type,
@@ -9,7 +9,7 @@ from starlette import status
9
9
  import prefect.context
10
10
  import prefect.settings
11
11
  from prefect.client.base import PrefectHttpxAsyncClient
12
- from prefect.client.schemas import Workspace
12
+ from prefect.client.schemas.objects import Workspace
13
13
  from prefect.exceptions import ObjectNotFound, PrefectException
14
14
  from prefect.settings import (
15
15
  PREFECT_API_KEY,
@@ -377,6 +377,10 @@ class DeploymentFlowRunCreate(ActionBaseModel):
377
377
  parameters: Dict[str, Any] = Field(
378
378
  default_factory=dict, description="The parameters for the flow run."
379
379
  )
380
+ enforce_parameter_schema: Optional[bool] = Field(
381
+ default=None,
382
+ description="Whether or not to enforce the parameter schema on this run.",
383
+ )
380
384
  context: Dict[str, Any] = Field(
381
385
  default_factory=dict, description="The context for the flow run."
382
386
  )
@@ -791,7 +791,7 @@ class TaskRun(ObjectBaseModel):
791
791
 
792
792
  state: Optional[State] = Field(
793
793
  default=None,
794
- description="The state of the flow run.",
794
+ description="The state of the task run.",
795
795
  examples=["State(type=StateType.COMPLETED)"],
796
796
  )
797
797
 
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
  from contextlib import asynccontextmanager
3
- from typing import List, Literal, Optional, Union, cast
3
+ from typing import AsyncGenerator, List, Literal, Optional, Union, cast
4
4
 
5
5
  import httpx
6
6
  import pendulum
@@ -34,7 +34,7 @@ async def concurrency(
34
34
  names: Union[str, List[str]],
35
35
  occupy: int = 1,
36
36
  timeout_seconds: Optional[float] = None,
37
- ):
37
+ ) -> AsyncGenerator[None, None]:
38
38
  """A context manager that acquires and releases concurrency slots from the
39
39
  given concurrency limits.
40
40
 
@@ -77,7 +77,7 @@ async def concurrency(
77
77
  _emit_concurrency_release_events(limits, occupy, emitted_events)
78
78
 
79
79
 
80
- async def rate_limit(names: Union[str, List[str]], occupy: int = 1):
80
+ async def rate_limit(names: Union[str, List[str]], occupy: int = 1) -> None:
81
81
  """Block execution until an `occupy` number of slots of the concurrency
82
82
  limits given in `names` are acquired. Requires that all given concurrency
83
83
  limits have a slot decay.
@@ -54,6 +54,6 @@ def _emit_concurrency_release_events(
54
54
  limits: List[MinimalConcurrencyLimitResponse],
55
55
  occupy: int,
56
56
  events: Dict[UUID, Optional[Event]],
57
- ):
57
+ ) -> None:
58
58
  for limit in limits:
59
59
  _emit_concurrency_event("released", limit, limits, occupy, events[limit.id])
@@ -3,6 +3,7 @@ import concurrent.futures
3
3
  from contextlib import asynccontextmanager
4
4
  from typing import (
5
5
  TYPE_CHECKING,
6
+ AsyncGenerator,
6
7
  FrozenSet,
7
8
  Optional,
8
9
  Tuple,
@@ -27,14 +28,14 @@ class ConcurrencySlotAcquisitionService(QueueService):
27
28
  self.concurrency_limit_names = sorted(list(concurrency_limit_names))
28
29
 
29
30
  @asynccontextmanager
30
- async def _lifespan(self):
31
+ async def _lifespan(self) -> AsyncGenerator[None, None]:
31
32
  async with get_client() as client:
32
33
  self._client = client
33
34
  yield
34
35
 
35
36
  async def _handle(
36
37
  self, item: Tuple[int, str, Optional[float], concurrent.futures.Future]
37
- ):
38
+ ) -> None:
38
39
  occupy, mode, timeout_seconds, future = item
39
40
  try:
40
41
  response = await self.acquire_slots(occupy, mode, timeout_seconds)
@@ -1,5 +1,15 @@
1
1
  from contextlib import contextmanager
2
- from typing import List, Optional, Union, cast
2
+ from typing import (
3
+ Any,
4
+ Awaitable,
5
+ Callable,
6
+ Generator,
7
+ List,
8
+ Optional,
9
+ TypeVar,
10
+ Union,
11
+ cast,
12
+ )
3
13
 
4
14
  import pendulum
5
15
 
@@ -22,13 +32,15 @@ from .events import (
22
32
  _emit_concurrency_release_events,
23
33
  )
24
34
 
35
+ T = TypeVar("T")
36
+
25
37
 
26
38
  @contextmanager
27
39
  def concurrency(
28
40
  names: Union[str, List[str]],
29
41
  occupy: int = 1,
30
42
  timeout_seconds: Optional[float] = None,
31
- ):
43
+ ) -> Generator[None, None, None]:
32
44
  """A context manager that acquires and releases concurrency slots from the
33
45
  given concurrency limits.
34
46
 
@@ -75,7 +87,7 @@ def concurrency(
75
87
  _emit_concurrency_release_events(limits, occupy, emitted_events)
76
88
 
77
89
 
78
- def rate_limit(names: Union[str, List[str]], occupy: int = 1):
90
+ def rate_limit(names: Union[str, List[str]], occupy: int = 1) -> None:
79
91
  """Block execution until an `occupy` number of slots of the concurrency
80
92
  limits given in `names` are acquired. Requires that all given concurrency
81
93
  limits have a slot decay.
@@ -91,11 +103,13 @@ def rate_limit(names: Union[str, List[str]], occupy: int = 1):
91
103
  _emit_concurrency_acquisition_events(limits, occupy)
92
104
 
93
105
 
94
- def _call_async_function_from_sync(fn, *args, **kwargs):
106
+ def _call_async_function_from_sync(
107
+ fn: Callable[..., Awaitable[T]], *args: Any, **kwargs: Any
108
+ ) -> T:
95
109
  loop = get_running_loop()
96
110
  call = create_call(fn, *args, **kwargs)
97
111
 
98
112
  if loop is not None:
99
113
  return from_sync.call_soon_in_loop_thread(call).result()
100
114
  else:
101
- return call()
115
+ return call() # type: ignore [return-value]
@@ -9,6 +9,7 @@ For more user-accessible information about the current run, see [`prefect.runtim
9
9
  import os
10
10
  import sys
11
11
  import warnings
12
+ import weakref
12
13
  from contextlib import ExitStack, contextmanager
13
14
  from contextvars import ContextVar, Token
14
15
  from pathlib import Path
@@ -17,6 +18,7 @@ from typing import (
17
18
  Any,
18
19
  Dict,
19
20
  Generator,
21
+ Mapping,
20
22
  Optional,
21
23
  Set,
22
24
  Type,
@@ -291,8 +293,12 @@ class EngineContext(RunContext):
291
293
  # Counter for flow pauses
292
294
  observed_flow_pauses: Dict[str, int] = Field(default_factory=dict)
293
295
 
294
- # Tracking for result from task runs in this flow run
295
- task_run_results: Dict[int, State] = Field(default_factory=dict)
296
+ # Tracking for result from task runs in this flow run for dependency tracking
297
+ # Holds the ID of the object returned by the task run and task run state
298
+ # This is a weakref dictionary to avoid undermining garbage collection
299
+ task_run_results: Mapping[int, State] = Field(
300
+ default_factory=weakref.WeakValueDictionary
301
+ )
296
302
 
297
303
  # Events worker to emit events to Prefect Cloud
298
304
  events: Optional[EventsWorker] = None
@@ -0,0 +1,33 @@
1
+ from typing import TYPE_CHECKING
2
+ from prefect._internal.compatibility.migration import getattr_migration
3
+
4
+
5
+ if TYPE_CHECKING:
6
+ from .flow_runs import run_deployment
7
+ from .base import initialize_project
8
+ from .runner import deploy
9
+
10
+ _public_api: dict[str, tuple[str, str]] = {
11
+ "initialize_project": (__spec__.parent, ".base"),
12
+ "run_deployment": (__spec__.parent, ".flow_runs"),
13
+ "deploy": (__spec__.parent, ".runner"),
14
+ }
15
+
16
+ # Declare API for type-checkers
17
+ __all__ = ["initialize_project", "deploy", "run_deployment"]
18
+
19
+
20
+ def __getattr__(attr_name: str) -> object:
21
+ dynamic_attr = _public_api.get(attr_name)
22
+ if dynamic_attr is None:
23
+ return getattr_migration(__name__)(attr_name)
24
+
25
+ package, module_name = dynamic_attr
26
+
27
+ from importlib import import_module
28
+
29
+ if module_name == "__module__":
30
+ return import_module(f".{attr_name}", package=package)
31
+ else:
32
+ module = import_module(module_name, package=package)
33
+ return getattr(module, attr_name)
@@ -6,6 +6,7 @@ import os
6
6
  from pathlib import Path
7
7
  from typing import TYPE_CHECKING, Any, Optional
8
8
 
9
+ from prefect._internal.retries import retry_async_fn
9
10
  from prefect.logging.loggers import get_logger
10
11
  from prefect.runner.storage import BlockStorageAdapter, GitRepository, RemoteStorage
11
12
  from prefect.utilities.asyncutils import sync_compatible
@@ -31,6 +32,12 @@ def set_working_directory(directory: str) -> dict:
31
32
  return dict(directory=directory)
32
33
 
33
34
 
35
+ @retry_async_fn(
36
+ max_attempts=3,
37
+ base_delay=1,
38
+ max_delay=10,
39
+ retry_on_exceptions=(RuntimeError,),
40
+ )
34
41
  @sync_compatible
35
42
  async def git_clone(
36
43
  repository: str,
@@ -60,6 +60,16 @@ class Resource(Labelled):
60
60
  def name(self) -> Optional[str]:
61
61
  return self.get("prefect.resource.name")
62
62
 
63
+ def prefect_object_id(self, kind: str) -> UUID:
64
+ """Extracts the UUID from an event's resource ID if it's the expected kind
65
+ of prefect resource"""
66
+ prefix = f"{kind}." if not kind.endswith(".") else kind
67
+
68
+ if not self.id.startswith(prefix):
69
+ raise ValueError(f"Resource ID {self.id} does not start with {prefix}")
70
+
71
+ return UUID(self.id[len(prefix) :])
72
+
63
73
 
64
74
  class RelatedResource(Resource):
65
75
  """A Resource with a specific role in an Event"""
@@ -7,7 +7,6 @@ from dataclasses import dataclass, field
7
7
  from typing import (
8
8
  Any,
9
9
  AsyncGenerator,
10
- Callable,
11
10
  Coroutine,
12
11
  Dict,
13
12
  Generator,
@@ -92,9 +91,12 @@ def load_flow_and_flow_run(flow_run_id: UUID) -> Tuple[FlowRun, Flow]:
92
91
 
93
92
  flow_run = client.read_flow_run(flow_run_id)
94
93
  if entrypoint:
95
- flow = load_flow_from_entrypoint(entrypoint)
94
+ # we should not accept a placeholder flow at runtime
95
+ flow = load_flow_from_entrypoint(entrypoint, use_placeholder_flow=False)
96
96
  else:
97
- flow = run_coro_as_sync(load_flow_from_flow_run(flow_run))
97
+ flow = run_coro_as_sync(
98
+ load_flow_from_flow_run(flow_run, use_placeholder_flow=False)
99
+ )
98
100
 
99
101
  return flow_run, flow
100
102
 
@@ -415,7 +417,7 @@ class FlowRunEngine(Generic[P, R]):
415
417
 
416
418
  return flow_run
417
419
 
418
- def call_hooks(self, state: Optional[State] = None) -> Iterable[Callable]:
420
+ def call_hooks(self, state: Optional[State] = None):
419
421
  if state is None:
420
422
  state = self.state
421
423
  flow = self.flow
@@ -613,11 +615,7 @@ class FlowRunEngine(Generic[P, R]):
613
615
 
614
616
  if self.state.is_running():
615
617
  self.call_hooks()
616
- try:
617
- yield
618
- finally:
619
- if self.state.is_final() or self.state.is_cancelling():
620
- self.call_hooks()
618
+ yield
621
619
 
622
620
  @contextmanager
623
621
  def run_context(self):
@@ -638,6 +636,9 @@ class FlowRunEngine(Generic[P, R]):
638
636
  except Exception as exc:
639
637
  self.logger.exception("Encountered exception during execution: %r", exc)
640
638
  self.handle_exception(exc)
639
+ finally:
640
+ if self.state.is_final() or self.state.is_cancelling():
641
+ self.call_hooks()
641
642
 
642
643
  def call_flow_fn(self) -> Union[R, Coroutine[Any, Any, R]]:
643
644
  """