prefect-client 3.0.0rc1__tar.gz → 3.0.0rc2__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 (189) hide show
  1. {prefect-client-3.0.0rc1/src/prefect_client.egg-info → prefect-client-3.0.0rc2}/PKG-INFO +1 -1
  2. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/requirements-client.txt +1 -0
  3. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/requirements-dev.txt +1 -2
  4. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/requirements.txt +1 -1
  5. prefect-client-3.0.0rc2/src/prefect/blocks/redis.py +168 -0
  6. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/orchestration.py +17 -1
  7. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/objects.py +12 -8
  8. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/concurrency/asyncio.py +1 -1
  9. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/concurrency/services.py +1 -1
  10. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/base.py +7 -1
  11. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/schemas/events.py +2 -0
  12. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/flow_engine.py +2 -2
  13. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/flow_runs.py +2 -2
  14. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/flows.py +8 -1
  15. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/futures.py +44 -43
  16. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/input/run_input.py +4 -2
  17. prefect-client-3.0.0rc2/src/prefect/records/cache_policies.py +179 -0
  18. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/settings.py +6 -3
  19. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/states.py +6 -4
  20. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/task_engine.py +169 -198
  21. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/task_runners.py +6 -2
  22. prefect-client-3.0.0rc2/src/prefect/task_runs.py +203 -0
  23. prefect-client-3.0.0rc1/src/prefect/task_server.py → prefect-client-3.0.0rc2/src/prefect/task_worker.py +37 -27
  24. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/tasks.py +49 -22
  25. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/transactions.py +6 -2
  26. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/callables.py +74 -3
  27. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/importtools.py +5 -5
  28. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/variables.py +15 -10
  29. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/workers/base.py +11 -1
  30. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2/src/prefect_client.egg-info}/PKG-INFO +1 -1
  31. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect_client.egg-info/SOURCES.txt +4 -1
  32. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect_client.egg-info/requires.txt +1 -0
  33. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/LICENSE +0 -0
  34. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/MANIFEST.in +0 -0
  35. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/README.md +0 -0
  36. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/setup.cfg +0 -0
  37. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/setup.py +0 -0
  38. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/.prefectignore +0 -0
  39. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/__init__.py +0 -0
  40. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/__init__.py +0 -0
  41. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/_logging.py +0 -0
  42. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/compatibility/__init__.py +0 -0
  43. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  44. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/compatibility/experimental.py +0 -0
  45. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/__init__.py +0 -0
  46. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/api.py +0 -0
  47. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/calls.py +0 -0
  48. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  49. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  50. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/inspection.py +0 -0
  51. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/primitives.py +0 -0
  52. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/services.py +0 -0
  53. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/threads.py +0 -0
  54. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/concurrency/waiters.py +0 -0
  55. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/__init__.py +0 -0
  56. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/annotations/__init__.py +0 -0
  57. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/annotations/pendulum.py +0 -0
  58. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/schemas.py +0 -0
  59. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  60. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  61. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
  62. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/pytz.py +0 -0
  63. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/schemas/__init__.py +0 -0
  64. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/schemas/bases.py +0 -0
  65. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/schemas/fields.py +0 -0
  66. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/schemas/serializers.py +0 -0
  67. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_internal/schemas/validators.py +0 -0
  68. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/_version.py +0 -0
  69. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/artifacts.py +0 -0
  70. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/automations.py +0 -0
  71. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/__init__.py +0 -0
  72. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/abstract.py +0 -0
  73. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/core.py +0 -0
  74. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/fields.py +0 -0
  75. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/kubernetes.py +0 -0
  76. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/notifications.py +0 -0
  77. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/system.py +0 -0
  78. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/blocks/webhook.py +0 -0
  79. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/__init__.py +0 -0
  80. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/base.py +0 -0
  81. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/cloud.py +0 -0
  82. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/collections.py +0 -0
  83. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/constants.py +0 -0
  84. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/__init__.py +0 -0
  85. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/actions.py +0 -0
  86. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/filters.py +0 -0
  87. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/responses.py +0 -0
  88. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/schedules.py +0 -0
  89. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/schemas/sorting.py +0 -0
  90. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/subscriptions.py +0 -0
  91. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/client/utilities.py +0 -0
  92. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/concurrency/__init__.py +0 -0
  93. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/concurrency/events.py +0 -0
  94. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/concurrency/sync.py +0 -0
  95. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/context.py +0 -0
  96. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/__init__.py +0 -0
  97. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/flow_runs.py +0 -0
  98. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/runner.py +0 -0
  99. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/schedules.py +0 -0
  100. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/steps/__init__.py +0 -0
  101. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/steps/core.py +0 -0
  102. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/steps/pull.py +0 -0
  103. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/deployments/steps/utility.py +0 -0
  104. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/engine.py +0 -0
  105. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/__init__.py +0 -0
  106. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/actions.py +0 -0
  107. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/cli/__init__.py +0 -0
  108. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/cli/automations.py +0 -0
  109. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/clients.py +0 -0
  110. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/filters.py +0 -0
  111. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/related.py +0 -0
  112. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/schemas/__init__.py +0 -0
  113. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/schemas/automations.py +0 -0
  114. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  115. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/schemas/labelling.py +0 -0
  116. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/utilities.py +0 -0
  117. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/events/worker.py +0 -0
  118. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/exceptions.py +0 -0
  119. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/filesystems.py +0 -0
  120. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/__init__.py +0 -0
  121. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  122. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  123. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  124. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  125. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  126. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/input/__init__.py +0 -0
  127. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/input/actions.py +0 -0
  128. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/__init__.py +0 -0
  129. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/configuration.py +0 -0
  130. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/filters.py +0 -0
  131. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/formatters.py +0 -0
  132. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/handlers.py +0 -0
  133. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/highlighters.py +0 -0
  134. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/loggers.py +0 -0
  135. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/logging/logging.yml +0 -0
  136. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/manifests.py +0 -0
  137. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/plugins.py +0 -0
  138. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/profiles.toml +0 -0
  139. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/py.typed +0 -0
  140. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/records/__init__.py +0 -0
  141. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/records/result_store.py +0 -0
  142. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/records/store.py +0 -0
  143. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/results.py +0 -0
  144. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/__init__.py +0 -0
  145. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/runner.py +0 -0
  146. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/server.py +0 -0
  147. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/storage.py +0 -0
  148. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/submit.py +0 -0
  149. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runner/utils.py +0 -0
  150. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runtime/__init__.py +0 -0
  151. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runtime/deployment.py +0 -0
  152. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runtime/flow_run.py +0 -0
  153. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/runtime/task_run.py +0 -0
  154. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/serializers.py +0 -0
  155. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  156. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  157. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/types/__init__.py +0 -0
  158. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/__init__.py +0 -0
  159. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/annotations.py +0 -0
  160. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/asyncutils.py +0 -0
  161. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/collections.py +0 -0
  162. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/compat.py +0 -0
  163. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/context.py +0 -0
  164. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/dispatch.py +0 -0
  165. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/dockerutils.py +0 -0
  166. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/engine.py +0 -0
  167. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/filesystem.py +0 -0
  168. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/hashing.py +0 -0
  169. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/math.py +0 -0
  170. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/names.py +0 -0
  171. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/processutils.py +0 -0
  172. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/pydantic.py +0 -0
  173. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/render_swagger.py +0 -0
  174. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  175. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  176. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/schema_tools/validation.py +0 -0
  177. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/services.py +0 -0
  178. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/slugify.py +0 -0
  179. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/templating.py +0 -0
  180. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/text.py +0 -0
  181. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/timeout.py +0 -0
  182. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/utilities/visualization.py +0 -0
  183. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/workers/__init__.py +0 -0
  184. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/workers/process.py +0 -0
  185. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/workers/server.py +0 -0
  186. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect/workers/utilities.py +0 -0
  187. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect_client.egg-info/dependency_links.txt +0 -0
  188. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/src/prefect_client.egg-info/top_level.txt +0 -0
  189. {prefect-client-3.0.0rc1 → prefect-client-3.0.0rc2}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc1
3
+ Version: 3.0.0rc2
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -4,6 +4,7 @@ cachetools >= 5.3, < 6.0
4
4
  cloudpickle >= 2.0, < 4.0
5
5
  coolname >= 1.0.4, < 3.0.0
6
6
  croniter >= 1.0.12, < 3.0.0
7
+ exceptiongroup >= 1.0.0
7
8
  fastapi >= 0.111.0, < 1.0.0
8
9
  fsspec >= 2022.5.0
9
10
  graphviz >= 0.20.1
@@ -2,7 +2,6 @@ ruff
2
2
  cairosvg
3
3
  codespell>=2.2.6
4
4
  ddtrace
5
- exceptiongroup
6
5
  ipython
7
6
  jinja2
8
7
  mkdocs
@@ -26,7 +25,7 @@ pytest-timeout
26
25
  pytest-xdist < 3.4.0 # 3.5.0 introduces some flakiness. Need to investigate and resolve.
27
26
  pytkdocs >= 0.14.2
28
27
  pyyaml
29
- requests<2.32.0 # `requests` renamed `get_connection` to `_get_connection`, which is a method docker-py monkeypatches. See https://github.com/docker/docker-py/issues/3256 Should be able to un-pin when docker-py hotfix is out.
28
+ redis>=5.0.1
30
29
  setuptools
31
30
  vermin
32
31
  virtualenv
@@ -7,7 +7,7 @@ asyncpg >= 0.23
7
7
  click >= 8.0, < 8.2
8
8
  cryptography >= 36.0.1
9
9
  dateparser >= 1.1.1, < 2.0.0
10
- docker >= 4.0, < 7.0
10
+ docker >= 4.0
11
11
  graphviz >= 0.20.1
12
12
  griffe >= 0.20.0
13
13
  jinja2 >= 3.0.0, < 4.0.0
@@ -0,0 +1,168 @@
1
+ from contextlib import asynccontextmanager
2
+ from pathlib import Path
3
+ from typing import AsyncGenerator, Optional, Union
4
+
5
+ try:
6
+ import redis.asyncio as redis
7
+ except ImportError:
8
+ raise ImportError(
9
+ "`redis-py` must be installed to use the `RedisStorageContainer` block. "
10
+ "You can install it with `pip install redis>=5.0.1"
11
+ )
12
+
13
+ from pydantic import Field
14
+ from pydantic.types import SecretStr
15
+ from typing_extensions import Self
16
+
17
+ from prefect.filesystems import WritableFileSystem
18
+ from prefect.utilities.asyncutils import sync_compatible
19
+
20
+
21
+ class RedisStorageContainer(WritableFileSystem):
22
+ """
23
+ Block used to interact with Redis as a filesystem
24
+
25
+ Attributes:
26
+ host (str): The value to store.
27
+ port (int): The value to store.
28
+ db (int): The value to store.
29
+ username (str): The value to store.
30
+ password (str): The value to store.
31
+ connection_string (str): The value to store.
32
+
33
+ Example:
34
+ Create a new block from hostname, username and password:
35
+ ```python
36
+ from prefect.blocks.redis import RedisStorageContainer
37
+
38
+ block = RedisStorageContainer.from_host(
39
+ host="myredishost.com", username="redis", password="SuperSecret")
40
+ block.save("BLOCK_NAME")
41
+ ```
42
+
43
+ Create a new block from a connection string
44
+ ```python
45
+ from prefect.blocks.redis import RedisStorageContainer
46
+ block = RedisStorageContainer.from_url(""redis://redis:SuperSecret@myredishost.com:6379")
47
+ block.save("BLOCK_NAME")
48
+ ```
49
+ """
50
+
51
+ _logo_url = "https://stprododpcmscdnendpoint.azureedge.net/assets/icons/redis.png"
52
+
53
+ host: Optional[str] = Field(default=None, description="Redis hostname")
54
+ port: int = Field(default=6379, description="Redis port")
55
+ db: int = Field(default=0, description="Redis DB index")
56
+ username: Optional[SecretStr] = Field(default=None, description="Redis username")
57
+ password: Optional[SecretStr] = Field(default=None, description="Redis password")
58
+ connection_string: Optional[SecretStr] = Field(
59
+ default=None, description="Redis connection string"
60
+ )
61
+
62
+ def block_initialization(self) -> None:
63
+ if self.connection_string:
64
+ return
65
+ if not self.host:
66
+ raise ValueError("Initialization error: 'host' is required but missing.")
67
+ if self.username and not self.password:
68
+ raise ValueError(
69
+ "Initialization error: 'username' is provided, but 'password' is missing. Both are required."
70
+ )
71
+
72
+ @sync_compatible
73
+ async def read_path(self, path: Union[Path, str]):
74
+ """Read the redis content at `path`
75
+
76
+ Args:
77
+ path: Redis key to read from
78
+
79
+ Returns:
80
+ Contents at key as bytes
81
+ """
82
+ async with self._client() as client:
83
+ return await client.get(str(path))
84
+
85
+ @sync_compatible
86
+ async def write_path(self, path: Union[Path, str], content: bytes):
87
+ """Write `content` to the redis at `path`
88
+
89
+ Args:
90
+ path: Redis key to write to
91
+ content: Binary object to write
92
+ """
93
+
94
+ async with self._client() as client:
95
+ return await client.set(str(path), content)
96
+
97
+ @asynccontextmanager
98
+ async def _client(self) -> AsyncGenerator[redis.Redis, None]:
99
+ if self.connection_string:
100
+ client = redis.Redis.from_url(self.connection_string.get_secret_value())
101
+ else:
102
+ assert self.host
103
+ client = redis.Redis(
104
+ host=self.host,
105
+ port=self.port,
106
+ username=self.username.get_secret_value() if self.username else None,
107
+ password=self.password.get_secret_value() if self.password else None,
108
+ db=self.db,
109
+ )
110
+
111
+ try:
112
+ yield client
113
+ finally:
114
+ await client.aclose()
115
+
116
+ @classmethod
117
+ def from_host(
118
+ cls,
119
+ host: str,
120
+ port: int = 6379,
121
+ db: int = 0,
122
+ username: Union[None, str, SecretStr] = None,
123
+ password: Union[None, str, SecretStr] = None,
124
+ ) -> Self:
125
+ """Create block from hostname, username and password
126
+
127
+ Args:
128
+ host: Redis hostname
129
+ username: Redis username
130
+ password: Redis password
131
+ port: Redis port
132
+
133
+ Returns:
134
+ `RedisStorageContainer` instance
135
+ """
136
+
137
+ username = SecretStr(username) if isinstance(username, str) else username
138
+ password = SecretStr(password) if isinstance(password, str) else password
139
+
140
+ return cls(host=host, port=port, db=db, username=username, password=password)
141
+
142
+ @classmethod
143
+ def from_connection_string(cls, connection_string: Union[str, SecretStr]) -> Self:
144
+ """Create block from a Redis connection string
145
+
146
+ Supports the following URL schemes:
147
+ - `redis://` creates a TCP socket connection
148
+ - `rediss://` creates a SSL wrapped TCP socket connection
149
+ - `unix://` creates a Unix Domain Socket connection
150
+
151
+ See [Redis docs](https://redis.readthedocs.io/en/stable/examples
152
+ /connection_examples.html#Connecting-to-Redis-instances-by-specifying-a-URL
153
+ -scheme.) for more info.
154
+
155
+ Args:
156
+ connection_string: Redis connection string
157
+
158
+ Returns:
159
+ `RedisStorageContainer` instance
160
+ """
161
+
162
+ connection_string = (
163
+ SecretStr(connection_string)
164
+ if isinstance(connection_string, str)
165
+ else connection_string
166
+ )
167
+
168
+ return cls(connection_string=connection_string)
@@ -8,11 +8,13 @@ from typing import (
8
8
  Dict,
9
9
  Iterable,
10
10
  List,
11
+ Literal,
11
12
  Optional,
12
13
  Set,
13
14
  Tuple,
14
15
  TypeVar,
15
16
  Union,
17
+ overload,
16
18
  )
17
19
  from uuid import UUID, uuid4
18
20
 
@@ -156,9 +158,23 @@ class ServerType(AutoEnum):
156
158
  CLOUD = AutoEnum.auto()
157
159
 
158
160
 
161
+ @overload
162
+ def get_client(
163
+ httpx_settings: Optional[Dict[str, Any]] = None, sync_client: Literal[False] = False
164
+ ) -> "PrefectClient":
165
+ ...
166
+
167
+
168
+ @overload
169
+ def get_client(
170
+ httpx_settings: Optional[Dict[str, Any]] = None, sync_client: Literal[True] = True
171
+ ) -> "SyncPrefectClient":
172
+ ...
173
+
174
+
159
175
  def get_client(
160
176
  httpx_settings: Optional[Dict[str, Any]] = None, sync_client: bool = False
161
- ) -> Union["PrefectClient", "SyncPrefectClient"]:
177
+ ):
162
178
  """
163
179
  Retrieve a HTTP client for communicating with the Prefect REST API.
164
180
 
@@ -94,6 +94,14 @@ class StateType(AutoEnum):
94
94
  CANCELLING = AutoEnum.auto()
95
95
 
96
96
 
97
+ TERMINAL_STATES = {
98
+ StateType.COMPLETED,
99
+ StateType.CANCELLED,
100
+ StateType.FAILED,
101
+ StateType.CRASHED,
102
+ }
103
+
104
+
97
105
  class WorkPoolStatus(AutoEnum):
98
106
  """Enumeration of work pool statuses."""
99
107
 
@@ -280,7 +288,7 @@ class State(ObjectBaseModel, Generic[R]):
280
288
  def default_scheduled_start_time(self) -> Self:
281
289
  if self.type == StateType.SCHEDULED:
282
290
  if not self.state_details.scheduled_time:
283
- self.state_details.scheduled_time = pendulum.now("utc")
291
+ self.state_details.scheduled_time = DateTime.now("utc")
284
292
  return self
285
293
 
286
294
  def is_scheduled(self) -> bool:
@@ -308,12 +316,7 @@ class State(ObjectBaseModel, Generic[R]):
308
316
  return self.type == StateType.CANCELLING
309
317
 
310
318
  def is_final(self) -> bool:
311
- return self.type in {
312
- StateType.CANCELLED,
313
- StateType.FAILED,
314
- StateType.COMPLETED,
315
- StateType.CRASHED,
316
- }
319
+ return self.type in TERMINAL_STATES
317
320
 
318
321
  def is_paused(self) -> bool:
319
322
  return self.type == StateType.PAUSED
@@ -550,7 +553,8 @@ class FlowRun(ObjectBaseModel):
550
553
  examples=["State(type=StateType.COMPLETED)"],
551
554
  )
552
555
  job_variables: Optional[dict] = Field(
553
- default=None, description="Job variables for the flow run."
556
+ default=None,
557
+ description="Job variables for the flow run.",
554
558
  )
555
559
 
556
560
  # These are server-side optimizations and should not be present on client models
@@ -11,7 +11,7 @@ except ImportError:
11
11
  # pendulum < 3
12
12
  from pendulum.period import Period as Interval # type: ignore
13
13
 
14
- from prefect import get_client
14
+ from prefect.client.orchestration import get_client
15
15
  from prefect.client.schemas.responses import MinimalConcurrencyLimitResponse
16
16
  from prefect.utilities.timeout import timeout_async
17
17
 
@@ -10,9 +10,9 @@ from typing import (
10
10
  import httpx
11
11
  from starlette import status
12
12
 
13
- from prefect import get_client
14
13
  from prefect._internal.concurrency import logger
15
14
  from prefect._internal.concurrency.services import QueueService
15
+ from prefect.client.orchestration import get_client
16
16
 
17
17
  if TYPE_CHECKING:
18
18
  from prefect.client.orchestration import PrefectClient
@@ -398,7 +398,13 @@ async def _find_flow_functions_in_file(filename: str) -> List[Dict]:
398
398
  return decorated_functions
399
399
 
400
400
  for node in ast.walk(tree):
401
- if isinstance(node, ast.FunctionDef):
401
+ if isinstance(
402
+ node,
403
+ (
404
+ ast.FunctionDef,
405
+ ast.AsyncFunctionDef,
406
+ ),
407
+ ):
402
408
  for decorator in node.decorator_list:
403
409
  # handles @flow
404
410
  is_name_match = (
@@ -83,6 +83,8 @@ class RelatedResource(Resource):
83
83
  class Event(PrefectBaseModel):
84
84
  """The client-side view of an event that has happened to a Resource"""
85
85
 
86
+ model_config = ConfigDict(extra="ignore")
87
+
86
88
  occurred: DateTime = Field(
87
89
  default_factory=lambda: pendulum.now("UTC"),
88
90
  description="When the event happened from the sender's perspective",
@@ -25,9 +25,9 @@ import anyio._backends._asyncio
25
25
  from sniffio import AsyncLibraryNotFoundError
26
26
  from typing_extensions import ParamSpec
27
27
 
28
- from prefect import Task, get_client
28
+ from prefect import Task
29
29
  from prefect._internal.concurrency.api import create_call, from_sync
30
- from prefect.client.orchestration import SyncPrefectClient
30
+ from prefect.client.orchestration import SyncPrefectClient, get_client
31
31
  from prefect.client.schemas import FlowRun, TaskRun
32
32
  from prefect.client.schemas.filters import FlowRunFilter
33
33
  from prefect.client.schemas.sorting import FlowRunSort
@@ -76,7 +76,7 @@ async def wait_for_flow_run(
76
76
  ```python
77
77
  import asyncio
78
78
 
79
- from prefect import get_client
79
+ from prefect.client.orchestration import get_client
80
80
  from prefect.flow_runs import wait_for_flow_run
81
81
 
82
82
  async def main():
@@ -94,7 +94,7 @@ async def wait_for_flow_run(
94
94
  ```python
95
95
  import asyncio
96
96
 
97
- from prefect import get_client
97
+ from prefect.client.orchestration import get_client
98
98
  from prefect.flow_runs import wait_for_flow_run
99
99
 
100
100
  async def main(num_runs: int):
@@ -1913,7 +1913,14 @@ def load_flow_argument_from_entrypoint(
1913
1913
  (
1914
1914
  node
1915
1915
  for node in ast.walk(parsed_code)
1916
- if isinstance(node, ast.FunctionDef) and node.name == func_name
1916
+ if isinstance(
1917
+ node,
1918
+ (
1919
+ ast.FunctionDef,
1920
+ ast.AsyncFunctionDef,
1921
+ ),
1922
+ )
1923
+ and node.name == func_name
1917
1924
  ),
1918
1925
  None,
1919
1926
  )
@@ -1,7 +1,6 @@
1
1
  import abc
2
2
  import concurrent.futures
3
3
  import inspect
4
- import time
5
4
  import uuid
6
5
  from functools import partial
7
6
  from typing import Any, Generic, Optional, Set, Union, cast
@@ -11,13 +10,17 @@ from typing_extensions import TypeVar
11
10
  from prefect.client.orchestration import get_client
12
11
  from prefect.client.schemas.objects import TaskRun
13
12
  from prefect.exceptions import ObjectNotFound
13
+ from prefect.logging.loggers import get_logger
14
14
  from prefect.states import Pending, State
15
+ from prefect.task_runs import TaskRunWaiter
15
16
  from prefect.utilities.annotations import quote
16
17
  from prefect.utilities.asyncutils import run_coro_as_sync
17
18
  from prefect.utilities.collections import StopVisiting, visit_collection
18
19
 
19
20
  F = TypeVar("F")
20
21
 
22
+ logger = get_logger(__name__)
23
+
21
24
 
22
25
  class PrefectFuture(abc.ABC):
23
26
  """
@@ -146,68 +149,66 @@ class PrefectDistributedFuture(PrefectFuture):
146
149
  Represents the result of a computation happening anywhere.
147
150
 
148
151
  This class is typically used to interact with the result of a task run
149
- scheduled to run in a Prefect task server but can be used to interact with
152
+ scheduled to run in a Prefect task worker but can be used to interact with
150
153
  any task run scheduled in Prefect's API.
151
154
  """
152
155
 
153
- def __init__(self, task_run_id: uuid.UUID):
154
- self._task_run = None
155
- self._client = None
156
- super().__init__(task_run_id=task_run_id)
157
-
158
- @property
159
- def client(self):
160
- if self._client is None:
161
- self._client = get_client(sync_client=True)
162
- return self._client
156
+ def wait(self, timeout: Optional[float] = None) -> None:
157
+ return run_coro_as_sync(self.wait_async(timeout=timeout))
163
158
 
164
- @property
165
- def task_run(self):
166
- if self._task_run is None:
167
- self._task_run = self.client.read_task_run(task_run_id=self.task_run_id)
168
- return self._task_run
169
-
170
- @task_run.setter
171
- def task_run(self, task_run):
172
- self._task_run = task_run
173
-
174
- def wait(
175
- self, timeout: Optional[float] = None, polling_interval: Optional[float] = 0.2
176
- ) -> None:
177
- start_time = time.time()
178
- # TODO: Websocket implementation?
179
- while True:
180
- self.task_run = cast(
181
- TaskRun, self.client.read_task_run(task_run_id=self.task_run_id)
159
+ async def wait_async(self, timeout: Optional[float] = None):
160
+ if self._final_state:
161
+ logger.debug(
162
+ "Final state already set for %s. Returning...", self.task_run_id
182
163
  )
183
- if self.task_run.state and self.task_run.state.is_final():
184
- self._final_state = self.task_run.state
185
- return
186
- if timeout is not None and (time.time() - start_time) > timeout:
164
+ return
165
+
166
+ # Read task run to see if it is still running
167
+ async with get_client() as client:
168
+ task_run = await client.read_task_run(task_run_id=self._task_run_id)
169
+ if task_run.state.is_final():
170
+ logger.debug(
171
+ "Task run %s already finished. Returning...",
172
+ self.task_run_id,
173
+ )
174
+ self._final_state = task_run.state
187
175
  return
188
- time.sleep(polling_interval)
176
+
177
+ # If still running, wait for a completed event from the server
178
+ logger.debug(
179
+ "Waiting for completed event for task run %s...",
180
+ self.task_run_id,
181
+ )
182
+ await TaskRunWaiter.wait_for_task_run(self._task_run_id, timeout=timeout)
183
+ task_run = await client.read_task_run(task_run_id=self._task_run_id)
184
+ if task_run.state.is_final():
185
+ self._final_state = task_run.state
186
+ return
189
187
 
190
188
  def result(
191
189
  self,
192
190
  timeout: Optional[float] = None,
193
191
  raise_on_failure: bool = True,
194
- polling_interval: Optional[float] = 0.2,
195
192
  ) -> Any:
193
+ return run_coro_as_sync(
194
+ self.result_async(timeout=timeout, raise_on_failure=raise_on_failure)
195
+ )
196
+
197
+ async def result_async(
198
+ self,
199
+ timeout: Optional[float] = None,
200
+ raise_on_failure: bool = True,
201
+ ):
196
202
  if not self._final_state:
197
- self.wait(timeout=timeout)
203
+ await self.wait_async(timeout=timeout)
198
204
  if not self._final_state:
199
205
  raise TimeoutError(
200
206
  f"Task run {self.task_run_id} did not complete within {timeout} seconds"
201
207
  )
202
208
 
203
- _result = self._final_state.result(
209
+ return await self._final_state.result(
204
210
  raise_on_failure=raise_on_failure, fetch=True
205
211
  )
206
- # state.result is a `sync_compatible` function that may or may not return an awaitable
207
- # depending on whether the parent frame is sync or not
208
- if inspect.isawaitable(_result):
209
- _result = run_coro_as_sync(_result)
210
- return _result
211
212
 
212
213
  def __eq__(self, other):
213
214
  if not isinstance(other, PrefectDistributedFuture):
@@ -18,7 +18,8 @@ Sender flow:
18
18
  ```python
19
19
  import random
20
20
  from uuid import UUID
21
- from prefect import flow, get_run_logger
21
+ from prefect import flow
22
+ from prefect.logging import get_run_logger
22
23
  from prefect.input import RunInput
23
24
 
24
25
  class NumberData(RunInput):
@@ -43,7 +44,8 @@ Receiver flow:
43
44
  ```python
44
45
  import random
45
46
  from uuid import UUID
46
- from prefect import flow, get_run_logger
47
+ from prefect import flow
48
+ from prefect.logging import get_run_logger
47
49
  from prefect.input import RunInput
48
50
 
49
51
  class NumberData(RunInput):