prefect-client 2.19.4__tar.gz → 2.19.6__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 (302) hide show
  1. {prefect-client-2.19.4/src/prefect_client.egg-info → prefect-client-2.19.6}/PKG-INFO +1 -1
  2. {prefect-client-2.19.4 → prefect-client-2.19.6}/requirements.txt +1 -1
  3. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/actions.py +1 -1
  4. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/concurrency/asyncio.py +14 -4
  5. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/concurrency/services.py +29 -22
  6. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/concurrency/sync.py +3 -5
  7. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/flows.py +33 -8
  8. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/container.py +6 -0
  9. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/storage.py +79 -6
  10. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/importtools.py +29 -0
  11. {prefect-client-2.19.4 → prefect-client-2.19.6/src/prefect_client.egg-info}/PKG-INFO +1 -1
  12. {prefect-client-2.19.4 → prefect-client-2.19.6}/LICENSE +0 -0
  13. {prefect-client-2.19.4 → prefect-client-2.19.6}/MANIFEST.in +0 -0
  14. {prefect-client-2.19.4 → prefect-client-2.19.6}/README.md +0 -0
  15. {prefect-client-2.19.4 → prefect-client-2.19.6}/requirements-client.txt +0 -0
  16. {prefect-client-2.19.4 → prefect-client-2.19.6}/requirements-dev.txt +0 -0
  17. {prefect-client-2.19.4 → prefect-client-2.19.6}/setup.cfg +0 -0
  18. {prefect-client-2.19.4 → prefect-client-2.19.6}/setup.py +0 -0
  19. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/.prefectignore +0 -0
  20. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/__init__.py +0 -0
  21. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/__init__.py +0 -0
  22. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/_logging.py +0 -0
  23. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/compatibility/__init__.py +0 -0
  24. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  25. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/compatibility/experimental.py +0 -0
  26. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/__init__.py +0 -0
  27. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/api.py +0 -0
  28. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/calls.py +0 -0
  29. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  30. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  31. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/inspection.py +0 -0
  32. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/primitives.py +0 -0
  33. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/services.py +0 -0
  34. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/threads.py +0 -0
  35. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/concurrency/waiters.py +0 -0
  36. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/__init__.py +0 -0
  37. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/_base_model.py +0 -0
  38. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/_compat.py +0 -0
  39. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/_flags.py +0 -0
  40. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/_types.py +0 -0
  41. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/annotations/__init__.py +0 -0
  42. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/annotations/pendulum.py +0 -0
  43. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/schemas.py +0 -0
  44. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/__init__.py +0 -0
  45. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/config_dict.py +0 -0
  46. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/field_validator.py +0 -0
  47. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_construct.py +0 -0
  48. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_copy.py +0 -0
  49. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_dump.py +0 -0
  50. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_dump_json.py +0 -0
  51. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_fields.py +0 -0
  52. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_fields_set.py +0 -0
  53. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_json_schema.py +0 -0
  54. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_rebuild.py +0 -0
  55. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_validate.py +0 -0
  56. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_validate_json.py +0 -0
  57. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/model_validator.py +0 -0
  58. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/utilities/type_adapter.py +0 -0
  59. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  60. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  61. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
  62. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/pytz.py +0 -0
  63. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/schemas/__init__.py +0 -0
  64. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/schemas/bases.py +0 -0
  65. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/schemas/fields.py +0 -0
  66. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/schemas/serializers.py +0 -0
  67. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_internal/schemas/validators.py +0 -0
  68. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/__init__.py +0 -0
  69. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/__init__.py +0 -0
  70. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/applications.py +0 -0
  71. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/background.py +0 -0
  72. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/concurrency.py +0 -0
  73. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/datastructures.py +0 -0
  74. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  75. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/dependencies/models.py +0 -0
  76. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/dependencies/utils.py +0 -0
  77. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/encoders.py +0 -0
  78. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/exception_handlers.py +0 -0
  79. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/exceptions.py +0 -0
  80. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/logger.py +0 -0
  81. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/__init__.py +0 -0
  82. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -0
  83. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/cors.py +0 -0
  84. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/gzip.py +0 -0
  85. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -0
  86. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/trustedhost.py +0 -0
  87. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/middleware/wsgi.py +0 -0
  88. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  89. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/openapi/constants.py +0 -0
  90. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/openapi/docs.py +0 -0
  91. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/openapi/models.py +0 -0
  92. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/openapi/utils.py +0 -0
  93. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/param_functions.py +0 -0
  94. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/params.py +0 -0
  95. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/requests.py +0 -0
  96. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/responses.py +0 -0
  97. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/routing.py +0 -0
  98. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/__init__.py +0 -0
  99. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/api_key.py +0 -0
  100. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/base.py +0 -0
  101. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/http.py +0 -0
  102. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/oauth2.py +0 -0
  103. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -0
  104. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/security/utils.py +0 -0
  105. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/staticfiles.py +0 -0
  106. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/templating.py +0 -0
  107. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/testclient.py +0 -0
  108. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/types.py +0 -0
  109. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/utils.py +0 -0
  110. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/fastapi/websockets.py +0 -0
  111. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/__init__.py +0 -0
  112. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/_compat.py +0 -0
  113. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/_exception_handler.py +0 -0
  114. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/_utils.py +0 -0
  115. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/applications.py +0 -0
  116. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/authentication.py +0 -0
  117. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/background.py +0 -0
  118. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/concurrency.py +0 -0
  119. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/config.py +0 -0
  120. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/convertors.py +0 -0
  121. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/datastructures.py +0 -0
  122. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/endpoints.py +0 -0
  123. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/exceptions.py +0 -0
  124. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/formparsers.py +0 -0
  125. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/__init__.py +0 -0
  126. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/authentication.py +0 -0
  127. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/base.py +0 -0
  128. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/cors.py +0 -0
  129. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/errors.py +0 -0
  130. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/exceptions.py +0 -0
  131. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/gzip.py +0 -0
  132. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/httpsredirect.py +0 -0
  133. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/sessions.py +0 -0
  134. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/trustedhost.py +0 -0
  135. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/middleware/wsgi.py +0 -0
  136. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/requests.py +0 -0
  137. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/responses.py +0 -0
  138. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/routing.py +0 -0
  139. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/schemas.py +0 -0
  140. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/staticfiles.py +0 -0
  141. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/status.py +0 -0
  142. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/templating.py +0 -0
  143. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/testclient.py +0 -0
  144. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/types.py +0 -0
  145. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_vendor/starlette/websockets.py +0 -0
  146. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/_version.py +0 -0
  147. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/agent.py +0 -0
  148. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/artifacts.py +0 -0
  149. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/automations.py +0 -0
  150. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/__init__.py +0 -0
  151. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/abstract.py +0 -0
  152. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/core.py +0 -0
  153. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/fields.py +0 -0
  154. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/kubernetes.py +0 -0
  155. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/notifications.py +0 -0
  156. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/system.py +0 -0
  157. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/blocks/webhook.py +0 -0
  158. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/__init__.py +0 -0
  159. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/base.py +0 -0
  160. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/cloud.py +0 -0
  161. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/collections.py +0 -0
  162. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/constants.py +0 -0
  163. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/orchestration.py +0 -0
  164. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/__init__.py +0 -0
  165. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/filters.py +0 -0
  166. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/objects.py +0 -0
  167. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/responses.py +0 -0
  168. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/schedules.py +0 -0
  169. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/schemas/sorting.py +0 -0
  170. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/subscriptions.py +0 -0
  171. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/client/utilities.py +0 -0
  172. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/concurrency/__init__.py +0 -0
  173. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/concurrency/events.py +0 -0
  174. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/context.py +0 -0
  175. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/__init__.py +0 -0
  176. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/base.py +0 -0
  177. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/deployments.py +0 -0
  178. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/runner.py +0 -0
  179. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/schedules.py +0 -0
  180. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/steps/__init__.py +0 -0
  181. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/steps/core.py +0 -0
  182. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/steps/pull.py +0 -0
  183. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deployments/steps/utility.py +0 -0
  184. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/__init__.py +0 -0
  185. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/data_documents.py +0 -0
  186. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/__init__.py +0 -0
  187. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/base.py +0 -0
  188. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/docker.py +0 -0
  189. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/file.py +0 -0
  190. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/orion.py +0 -0
  191. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/deprecated/packaging/serializers.py +0 -0
  192. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/engine.py +0 -0
  193. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/__init__.py +0 -0
  194. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/actions.py +0 -0
  195. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/cli/__init__.py +0 -0
  196. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/cli/automations.py +0 -0
  197. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/clients.py +0 -0
  198. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/filters.py +0 -0
  199. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/instrument.py +0 -0
  200. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/related.py +0 -0
  201. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/schemas/__init__.py +0 -0
  202. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/schemas/automations.py +0 -0
  203. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  204. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/schemas/events.py +0 -0
  205. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/schemas/labelling.py +0 -0
  206. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/utilities.py +0 -0
  207. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/events/worker.py +0 -0
  208. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/exceptions.py +0 -0
  209. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/filesystems.py +0 -0
  210. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/flow_runs.py +0 -0
  211. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/futures.py +0 -0
  212. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/__init__.py +0 -0
  213. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/base.py +0 -0
  214. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/kubernetes.py +0 -0
  215. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/process.py +0 -0
  216. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  217. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  218. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  219. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  220. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  221. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/input/__init__.py +0 -0
  222. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/input/actions.py +0 -0
  223. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/input/run_input.py +0 -0
  224. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/__init__.py +0 -0
  225. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/configuration.py +0 -0
  226. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/filters.py +0 -0
  227. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/formatters.py +0 -0
  228. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/handlers.py +0 -0
  229. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/highlighters.py +0 -0
  230. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/loggers.py +0 -0
  231. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/logging/logging.yml +0 -0
  232. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/manifests.py +0 -0
  233. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/new_flow_engine.py +0 -0
  234. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/new_task_engine.py +0 -0
  235. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/plugins.py +0 -0
  236. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/profiles.toml +0 -0
  237. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/py.typed +0 -0
  238. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/pydantic/__init__.py +0 -0
  239. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/pydantic/main.py +0 -0
  240. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/results.py +0 -0
  241. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/__init__.py +0 -0
  242. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/runner.py +0 -0
  243. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/server.py +0 -0
  244. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/submit.py +0 -0
  245. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runner/utils.py +0 -0
  246. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runtime/__init__.py +0 -0
  247. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runtime/deployment.py +0 -0
  248. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runtime/flow_run.py +0 -0
  249. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/runtime/task_run.py +0 -0
  250. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/serializers.py +0 -0
  251. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  252. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  253. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/settings.py +0 -0
  254. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/software/__init__.py +0 -0
  255. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/software/base.py +0 -0
  256. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/software/conda.py +0 -0
  257. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/software/pip.py +0 -0
  258. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/software/python.py +0 -0
  259. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/states.py +0 -0
  260. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/task_engine.py +0 -0
  261. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/task_runners.py +0 -0
  262. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/task_server.py +0 -0
  263. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/tasks.py +0 -0
  264. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/types/__init__.py +0 -0
  265. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/__init__.py +0 -0
  266. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/annotations.py +0 -0
  267. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/asyncutils.py +0 -0
  268. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/callables.py +0 -0
  269. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/collections.py +0 -0
  270. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/compat.py +0 -0
  271. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/context.py +0 -0
  272. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/dispatch.py +0 -0
  273. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/dockerutils.py +0 -0
  274. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/engine.py +0 -0
  275. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/filesystem.py +0 -0
  276. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/hashing.py +0 -0
  277. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/math.py +0 -0
  278. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/names.py +0 -0
  279. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/processutils.py +0 -0
  280. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/pydantic.py +0 -0
  281. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/render_swagger.py +0 -0
  282. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  283. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  284. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/schema_tools/validation.py +0 -0
  285. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/services.py +0 -0
  286. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/slugify.py +0 -0
  287. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/templating.py +0 -0
  288. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/text.py +0 -0
  289. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/timeout.py +0 -0
  290. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/utilities/visualization.py +0 -0
  291. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/variables.py +0 -0
  292. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/__init__.py +0 -0
  293. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/base.py +0 -0
  294. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/block.py +0 -0
  295. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/process.py +0 -0
  296. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/server.py +0 -0
  297. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect/workers/utilities.py +0 -0
  298. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect_client.egg-info/SOURCES.txt +0 -0
  299. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect_client.egg-info/dependency_links.txt +0 -0
  300. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect_client.egg-info/requires.txt +0 -0
  301. {prefect-client-2.19.4 → prefect-client-2.19.6}/src/prefect_client.egg-info/top_level.txt +0 -0
  302. {prefect-client-2.19.4 → prefect-client-2.19.6}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 2.19.4
3
+ Version: 2.19.6
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -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
@@ -778,7 +778,7 @@ class GlobalConcurrencyLimitUpdate(ActionBaseModel):
778
778
 
779
779
  name: Optional[str] = Field(None)
780
780
  limit: Optional[NonNegativeInteger] = Field(None)
781
- active: Optional[NonNegativeInteger] = Field(None)
781
+ active: Optional[bool] = Field(None)
782
782
  active_slots: Optional[NonNegativeInteger] = Field(None)
783
783
  slot_decay_per_second: Optional[NonNegativeFloat] = Field(None)
784
784
 
@@ -13,7 +13,6 @@ except ImportError:
13
13
 
14
14
  from prefect import get_client
15
15
  from prefect.client.schemas.responses import MinimalConcurrencyLimitResponse
16
- from prefect.utilities.timeout import timeout_async
17
16
 
18
17
  from .events import (
19
18
  _emit_concurrency_acquisition_events,
@@ -26,6 +25,10 @@ class ConcurrencySlotAcquisitionError(Exception):
26
25
  """Raised when an unhandlable occurs while acquiring concurrency slots."""
27
26
 
28
27
 
28
+ class AcquireConcurrencySlotTimeoutError(TimeoutError):
29
+ """Raised when acquiring a concurrency slot times out."""
30
+
31
+
29
32
  @asynccontextmanager
30
33
  async def concurrency(
31
34
  names: Union[str, List[str]],
@@ -58,8 +61,9 @@ async def concurrency(
58
61
  ```
59
62
  """
60
63
  names = names if isinstance(names, list) else [names]
61
- with timeout_async(seconds=timeout_seconds):
62
- limits = await _acquire_concurrency_slots(names, occupy)
64
+ limits = await _acquire_concurrency_slots(
65
+ names, occupy, timeout_seconds=timeout_seconds
66
+ )
63
67
  acquisition_time = pendulum.now("UTC")
64
68
  emitted_events = _emit_concurrency_acquisition_events(limits, occupy)
65
69
 
@@ -91,12 +95,18 @@ async def _acquire_concurrency_slots(
91
95
  names: List[str],
92
96
  slots: int,
93
97
  mode: Union[Literal["concurrency"], Literal["rate_limit"]] = "concurrency",
98
+ timeout_seconds: Optional[float] = None,
94
99
  ) -> List[MinimalConcurrencyLimitResponse]:
95
100
  service = ConcurrencySlotAcquisitionService.instance(frozenset(names))
96
- future = service.send((slots, mode))
101
+ future = service.send((slots, mode, timeout_seconds))
97
102
  response_or_exception = await asyncio.wrap_future(future)
98
103
 
99
104
  if isinstance(response_or_exception, Exception):
105
+ if isinstance(response_or_exception, TimeoutError):
106
+ raise AcquireConcurrencySlotTimeoutError(
107
+ f"Attempt to acquire concurrency slots timed out after {timeout_seconds} second(s)"
108
+ ) from response_or_exception
109
+
100
110
  raise ConcurrencySlotAcquisitionError(
101
111
  f"Unable to acquire concurrency slots on {names!r}"
102
112
  ) from response_or_exception
@@ -3,6 +3,7 @@ import concurrent.futures
3
3
  from contextlib import asynccontextmanager
4
4
  from typing import (
5
5
  FrozenSet,
6
+ Optional,
6
7
  Tuple,
7
8
  )
8
9
 
@@ -13,6 +14,7 @@ from prefect import get_client
13
14
  from prefect._internal.concurrency import logger
14
15
  from prefect._internal.concurrency.services import QueueService
15
16
  from prefect.client.orchestration import PrefectClient
17
+ from prefect.utilities.timeout import timeout_async
16
18
 
17
19
 
18
20
  class ConcurrencySlotAcquisitionService(QueueService):
@@ -27,10 +29,12 @@ class ConcurrencySlotAcquisitionService(QueueService):
27
29
  self._client = client
28
30
  yield
29
31
 
30
- async def _handle(self, item: Tuple[int, str, concurrent.futures.Future]):
31
- occupy, mode, future = item
32
+ async def _handle(
33
+ self, item: Tuple[int, str, Optional[float], concurrent.futures.Future]
34
+ ):
35
+ occupy, mode, timeout_seconds, future = item
32
36
  try:
33
- response = await self.acquire_slots(occupy, mode)
37
+ response = await self.acquire_slots(occupy, mode, timeout_seconds)
34
38
  except Exception as exc:
35
39
  # If the request to the increment endpoint fails in a non-standard
36
40
  # way, we need to set the future's result so that the caller can
@@ -40,25 +44,28 @@ class ConcurrencySlotAcquisitionService(QueueService):
40
44
  else:
41
45
  future.set_result(response)
42
46
 
43
- async def acquire_slots(self, slots: int, mode: str) -> httpx.Response:
44
- while True:
45
- try:
46
- response = await self._client.increment_concurrency_slots(
47
- names=self.concurrency_limit_names, slots=slots, mode=mode
48
- )
49
- except Exception as exc:
50
- if (
51
- isinstance(exc, httpx.HTTPStatusError)
52
- and exc.response.status_code == status.HTTP_423_LOCKED
53
- ):
54
- retry_after = float(exc.response.headers["Retry-After"])
55
- await asyncio.sleep(retry_after)
47
+ async def acquire_slots(
48
+ self, slots: int, mode: str, timeout_seconds: Optional[float] = None
49
+ ):
50
+ with timeout_async(timeout_seconds):
51
+ while True:
52
+ try:
53
+ response = await self._client.increment_concurrency_slots(
54
+ names=self.concurrency_limit_names, slots=slots, mode=mode
55
+ )
56
+ except Exception as exc:
57
+ if (
58
+ isinstance(exc, httpx.HTTPStatusError)
59
+ and exc.response.status_code == status.HTTP_423_LOCKED
60
+ ):
61
+ retry_after = float(exc.response.headers["Retry-After"])
62
+ await asyncio.sleep(retry_after)
63
+ else:
64
+ raise exc
56
65
  else:
57
- raise exc
58
- else:
59
- return response
66
+ return response
60
67
 
61
- def send(self, item: Tuple[int, str]):
68
+ def send(self, item: Tuple[int, str, Optional[float]]) -> concurrent.futures.Future:
62
69
  with self._lock:
63
70
  if self._stopped:
64
71
  raise RuntimeError("Cannot put items in a stopped service instance.")
@@ -66,7 +73,7 @@ class ConcurrencySlotAcquisitionService(QueueService):
66
73
  logger.debug("Service %r enqueuing item %r", self, item)
67
74
  future: concurrent.futures.Future = concurrent.futures.Future()
68
75
 
69
- occupy, mode = item
70
- self._queue.put_nowait((occupy, mode, future))
76
+ occupy, mode, timeout_seconds = item
77
+ self._queue.put_nowait((occupy, mode, timeout_seconds, future))
71
78
 
72
79
  return future
@@ -12,7 +12,6 @@ except ImportError:
12
12
  from prefect._internal.concurrency.api import create_call, from_sync
13
13
  from prefect._internal.concurrency.event_loop import get_running_loop
14
14
  from prefect.client.schemas.responses import MinimalConcurrencyLimitResponse
15
- from prefect.utilities.timeout import timeout
16
15
 
17
16
  from .asyncio import (
18
17
  _acquire_concurrency_slots,
@@ -57,10 +56,9 @@ def concurrency(
57
56
  """
58
57
  names = names if isinstance(names, list) else [names]
59
58
 
60
- with timeout(seconds=timeout_seconds):
61
- limits: List[MinimalConcurrencyLimitResponse] = _call_async_function_from_sync(
62
- _acquire_concurrency_slots, names, occupy
63
- )
59
+ limits: List[MinimalConcurrencyLimitResponse] = _call_async_function_from_sync(
60
+ _acquire_concurrency_slots, names, occupy, timeout_seconds=timeout_seconds
61
+ )
64
62
  acquisition_time = pendulum.now("UTC")
65
63
  emitted_events = _emit_concurrency_acquisition_events(limits, occupy)
66
64
 
@@ -83,8 +83,9 @@ from prefect.logging import get_logger
83
83
  from prefect.results import ResultSerializer, ResultStorage
84
84
  from prefect.runner.storage import (
85
85
  BlockStorageAdapter,
86
+ LocalStorage,
86
87
  RunnerStorage,
87
- create_storage_from_url,
88
+ create_storage_from_source,
88
89
  )
89
90
  from prefect.settings import (
90
91
  PREFECT_DEFAULT_WORK_POOL_NAME,
@@ -106,7 +107,7 @@ from prefect.utilities.callables import (
106
107
  )
107
108
  from prefect.utilities.collections import listrepr
108
109
  from prefect.utilities.hashing import file_hash
109
- from prefect.utilities.importtools import import_object
110
+ from prefect.utilities.importtools import import_object, safe_load_namespace
110
111
  from prefect.utilities.visualization import (
111
112
  FlowVisualizationError,
112
113
  GraphvizExecutableNotFoundError,
@@ -910,7 +911,7 @@ class Flow(Generic[P, R]):
910
911
  ```
911
912
  """
912
913
  if isinstance(source, str):
913
- storage = create_storage_from_url(source)
914
+ storage = create_storage_from_source(source)
914
915
  elif isinstance(source, RunnerStorage):
915
916
  storage = source
916
917
  elif hasattr(source, "get_directory"):
@@ -920,9 +921,11 @@ class Flow(Generic[P, R]):
920
921
  f"Unsupported source type {type(source).__name__!r}. Please provide a"
921
922
  " URL to remote storage or a storage object."
922
923
  )
924
+
923
925
  with tempfile.TemporaryDirectory() as tmpdir:
924
- storage.set_base_path(Path(tmpdir))
925
- await storage.pull_code()
926
+ if not isinstance(storage, LocalStorage):
927
+ storage.set_base_path(Path(tmpdir))
928
+ await storage.pull_code()
926
929
 
927
930
  full_entrypoint = str(storage.destination / entrypoint)
928
931
  flow: "Flow" = await from_async.wait_for_call_in_new_thread(
@@ -1850,11 +1853,33 @@ def load_flow_argument_from_entrypoint(
1850
1853
  ):
1851
1854
  for keyword in decorator.keywords:
1852
1855
  if keyword.arg == arg:
1853
- return (
1854
- keyword.value.value
1855
- ) # Return the string value of the argument
1856
+ if isinstance(keyword.value, ast.Constant):
1857
+ return (
1858
+ keyword.value.value
1859
+ ) # Return the string value of the argument
1860
+
1861
+ # if the arg value is not a raw str (i.e. a variable or expression),
1862
+ # then attempt to evaluate it
1863
+ namespace = safe_load_namespace(source_code)
1864
+ literal_arg_value = ast.get_source_segment(
1865
+ source_code, keyword.value
1866
+ )
1867
+ try:
1868
+ evaluated_value = eval(literal_arg_value, namespace) # type: ignore
1869
+ except Exception as e:
1870
+ logger.info(
1871
+ "Failed to parse @flow argument: `%s=%s` due to the following error. Ignoring and falling back to default behavior.",
1872
+ arg,
1873
+ literal_arg_value,
1874
+ exc_info=e,
1875
+ )
1876
+ # ignore the decorator arg and fallback to default behavior
1877
+ break
1878
+ return str(evaluated_value)
1856
1879
 
1857
1880
  if arg == "name":
1858
1881
  return func_name.replace(
1859
1882
  "_", "-"
1860
1883
  ) # If no matching decorator or keyword argument is found
1884
+
1885
+ return None
@@ -124,6 +124,12 @@ class BaseDockerLogin(Block, ABC):
124
124
  )
125
125
  class DockerRegistry(BaseDockerLogin):
126
126
  """
127
+ DEPRECATION WARNING:
128
+
129
+ This class is deprecated as of March 2024 and will not be available after September 2024.
130
+ It has been replaced by `DockerRegistryCredentials` from the `prefect-docker` package, which
131
+ offers enhanced functionality and better a better user experience.
132
+
127
133
  Connects to a Docker registry.
128
134
 
129
135
  Requires a Docker Engine to be connectable.
@@ -564,8 +564,74 @@ class BlockStorageAdapter:
564
564
  return False
565
565
 
566
566
 
567
- def create_storage_from_url(
568
- url: str, pull_interval: Optional[int] = 60
567
+ class LocalStorage:
568
+ """
569
+ Sets the working directory in the local filesystem.
570
+
571
+ Parameters:
572
+ Path: Local file path to set the working directory for the flow
573
+
574
+ Examples:
575
+ Sets the working directory for the local path to the flow:
576
+
577
+ ```python
578
+ from prefect.runner.storage import Localstorage
579
+
580
+ storage = LocalStorage(
581
+ path="/path/to/local/flow_directory",
582
+ )
583
+ ```
584
+ """
585
+
586
+ def __init__(
587
+ self,
588
+ path: str,
589
+ pull_interval: Optional[int] = None,
590
+ ):
591
+ self._path = Path(path).resolve()
592
+ self._logger = get_logger("runner.storage.local-storage")
593
+ self._storage_base_path = Path.cwd()
594
+ self._pull_interval = pull_interval
595
+
596
+ @property
597
+ def destination(self) -> Path:
598
+ return self._path
599
+
600
+ def set_base_path(self, path: Path):
601
+ self._storage_base_path = path
602
+
603
+ @property
604
+ def pull_interval(self) -> Optional[int]:
605
+ return self._pull_interval
606
+
607
+ async def pull_code(self):
608
+ # Local storage assumes the code already exists on the local filesystem
609
+ # and does not need to be pulled from a remote location
610
+ pass
611
+
612
+ def to_pull_step(self) -> dict:
613
+ """
614
+ Returns a dictionary representation of the storage object that can be
615
+ used as a deployment pull step.
616
+ """
617
+ step = {
618
+ "prefect.deployments.steps.set_working_directory": {
619
+ "directory": str(self.destination)
620
+ }
621
+ }
622
+ return step
623
+
624
+ def __eq__(self, __value) -> bool:
625
+ if isinstance(__value, LocalStorage):
626
+ return self._path == __value._path
627
+ return False
628
+
629
+ def __repr__(self) -> str:
630
+ return f"LocalStorage(path={self._path!r})"
631
+
632
+
633
+ def create_storage_from_source(
634
+ source: str, pull_interval: Optional[int] = 60
569
635
  ) -> RunnerStorage:
570
636
  """
571
637
  Creates a storage object from a URL.
@@ -579,11 +645,18 @@ def create_storage_from_url(
579
645
  Returns:
580
646
  RunnerStorage: A runner storage compatible object
581
647
  """
582
- parsed_url = urlparse(url)
583
- if parsed_url.scheme == "git" or parsed_url.path.endswith(".git"):
584
- return GitRepository(url=url, pull_interval=pull_interval)
648
+ logger = get_logger("runner.storage")
649
+ parsed_source = urlparse(source)
650
+ if parsed_source.scheme == "git" or parsed_source.path.endswith(".git"):
651
+ return GitRepository(url=source, pull_interval=pull_interval)
652
+ elif parsed_source.scheme in ("file", "local"):
653
+ source_path = source.split("://", 1)[-1]
654
+ return LocalStorage(path=source_path, pull_interval=pull_interval)
655
+ elif parsed_source.scheme in fsspec.available_protocols():
656
+ return RemoteStorage(url=source, pull_interval=pull_interval)
585
657
  else:
586
- return RemoteStorage(url=url, pull_interval=pull_interval)
658
+ logger.debug("No valid fsspec protocol found for URL, assuming local storage.")
659
+ return LocalStorage(path=source, pull_interval=pull_interval)
587
660
 
588
661
 
589
662
  def _format_token_from_credentials(netloc: str, credentials: dict) -> str:
@@ -381,6 +381,15 @@ def safe_load_namespace(source_code: str):
381
381
 
382
382
  namespace = {"__name__": "prefect_safe_namespace_loader"}
383
383
 
384
+ # Remove the body of the if __name__ == "__main__": block from the AST to prevent
385
+ # execution of guarded code
386
+ new_body = []
387
+ for node in parsed_code.body:
388
+ if _is_main_block(node):
389
+ continue
390
+ new_body.append(node)
391
+ parsed_code.body = new_body
392
+
384
393
  # Walk through the AST and find all import statements
385
394
  for node in ast.walk(parsed_code):
386
395
  if isinstance(node, ast.Import):
@@ -427,3 +436,23 @@ def safe_load_namespace(source_code: str):
427
436
  except Exception as e:
428
437
  logger.debug("Failed to compile: %s", e)
429
438
  return namespace
439
+
440
+
441
+ def _is_main_block(node: ast.AST):
442
+ """
443
+ Check if the node is an `if __name__ == "__main__":` block.
444
+ """
445
+ if isinstance(node, ast.If):
446
+ try:
447
+ # Check if the condition is `if __name__ == "__main__":`
448
+ if (
449
+ isinstance(node.test, ast.Compare)
450
+ and isinstance(node.test.left, ast.Name)
451
+ and node.test.left.id == "__name__"
452
+ and isinstance(node.test.comparators[0], ast.Constant)
453
+ and node.test.comparators[0].value == "__main__"
454
+ ):
455
+ return True
456
+ except AttributeError:
457
+ pass
458
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 2.19.4
3
+ Version: 2.19.6
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
File without changes