prefect-client 3.0.7__tar.gz → 3.0.8__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 (214) hide show
  1. {prefect-client-3.0.7/src/prefect_client.egg-info → prefect-client-3.0.8}/PKG-INFO +1 -1
  2. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_version.py +3 -3
  3. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/settings.py +126 -194
  4. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/collections.py +0 -70
  5. {prefect-client-3.0.7 → prefect-client-3.0.8/src/prefect_client.egg-info}/PKG-INFO +1 -1
  6. {prefect-client-3.0.7 → prefect-client-3.0.8}/LICENSE +0 -0
  7. {prefect-client-3.0.7 → prefect-client-3.0.8}/MANIFEST.in +0 -0
  8. {prefect-client-3.0.7 → prefect-client-3.0.8}/README.md +0 -0
  9. {prefect-client-3.0.7 → prefect-client-3.0.8}/requirements-client.txt +0 -0
  10. {prefect-client-3.0.7 → prefect-client-3.0.8}/requirements-dev.txt +0 -0
  11. {prefect-client-3.0.7 → prefect-client-3.0.8}/requirements.txt +0 -0
  12. {prefect-client-3.0.7 → prefect-client-3.0.8}/setup.cfg +0 -0
  13. {prefect-client-3.0.7 → prefect-client-3.0.8}/setup.py +0 -0
  14. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/.prefectignore +0 -0
  15. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/__init__.py +0 -0
  16. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/__init__.py +0 -0
  17. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/_logging.py +0 -0
  18. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/compatibility/__init__.py +0 -0
  19. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/compatibility/deprecated.py +0 -0
  20. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/compatibility/migration.py +0 -0
  21. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/__init__.py +0 -0
  22. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/api.py +0 -0
  23. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/calls.py +0 -0
  24. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/cancellation.py +0 -0
  25. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/event_loop.py +0 -0
  26. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/inspection.py +0 -0
  27. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/primitives.py +0 -0
  28. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/services.py +0 -0
  29. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/threads.py +0 -0
  30. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/concurrency/waiters.py +0 -0
  31. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/integrations.py +0 -0
  32. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/__init__.py +0 -0
  33. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/annotations/__init__.py +0 -0
  34. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/annotations/pendulum.py +0 -0
  35. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/schemas.py +0 -0
  36. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
  37. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
  38. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pydantic/v2_validated_func.py +0 -0
  39. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/pytz.py +0 -0
  40. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/retries.py +0 -0
  41. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/schemas/__init__.py +0 -0
  42. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/schemas/bases.py +0 -0
  43. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/schemas/fields.py +0 -0
  44. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/schemas/serializers.py +0 -0
  45. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/_internal/schemas/validators.py +0 -0
  46. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/agent.py +0 -0
  47. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/artifacts.py +0 -0
  48. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/automations.py +0 -0
  49. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/__init__.py +0 -0
  50. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/abstract.py +0 -0
  51. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/core.py +0 -0
  52. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/fields.py +0 -0
  53. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/notifications.py +0 -0
  54. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/redis.py +0 -0
  55. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/system.py +0 -0
  56. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/blocks/webhook.py +0 -0
  57. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/cache_policies.py +0 -0
  58. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/__init__.py +0 -0
  59. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/base.py +0 -0
  60. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/cloud.py +0 -0
  61. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/collections.py +0 -0
  62. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/constants.py +0 -0
  63. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/orchestration.py +0 -0
  64. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/__init__.py +0 -0
  65. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/actions.py +0 -0
  66. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/filters.py +0 -0
  67. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/objects.py +0 -0
  68. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/responses.py +0 -0
  69. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/schedules.py +0 -0
  70. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/schemas/sorting.py +0 -0
  71. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/subscriptions.py +0 -0
  72. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/types/__init__.py +0 -0
  73. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/types/flexible_schedule_list.py +0 -0
  74. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/client/utilities.py +0 -0
  75. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/__init__.py +0 -0
  76. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/asyncio.py +0 -0
  77. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/context.py +0 -0
  78. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/events.py +0 -0
  79. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/services.py +0 -0
  80. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/sync.py +0 -0
  81. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/__init__.py +0 -0
  82. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/asyncio.py +0 -0
  83. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/context.py +0 -0
  84. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/events.py +0 -0
  85. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/services.py +0 -0
  86. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/concurrency/v1/sync.py +0 -0
  87. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/context.py +0 -0
  88. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/__init__.py +0 -0
  89. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/base.py +0 -0
  90. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/deployments.py +0 -0
  91. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/flow_runs.py +0 -0
  92. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/runner.py +0 -0
  93. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/schedules.py +0 -0
  94. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/steps/__init__.py +0 -0
  95. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/steps/core.py +0 -0
  96. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/steps/pull.py +0 -0
  97. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/deployments/steps/utility.py +0 -0
  98. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/docker/__init__.py +0 -0
  99. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/docker/docker_image.py +0 -0
  100. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/engine.py +0 -0
  101. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/__init__.py +0 -0
  102. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/actions.py +0 -0
  103. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/cli/__init__.py +0 -0
  104. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/cli/automations.py +0 -0
  105. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/clients.py +0 -0
  106. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/filters.py +0 -0
  107. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/related.py +0 -0
  108. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/schemas/__init__.py +0 -0
  109. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/schemas/automations.py +0 -0
  110. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/schemas/deployment_triggers.py +0 -0
  111. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/schemas/events.py +0 -0
  112. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/schemas/labelling.py +0 -0
  113. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/utilities.py +0 -0
  114. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/events/worker.py +0 -0
  115. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/exceptions.py +0 -0
  116. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/filesystems.py +0 -0
  117. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/flow_engine.py +0 -0
  118. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/flow_runs.py +0 -0
  119. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/flows.py +0 -0
  120. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/futures.py +0 -0
  121. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/__init__.py +0 -0
  122. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/base.py +0 -0
  123. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
  124. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
  125. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
  126. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
  127. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/infrastructure/provisioners/modal.py +0 -0
  128. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/input/__init__.py +0 -0
  129. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/input/actions.py +0 -0
  130. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/input/run_input.py +0 -0
  131. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/locking/__init__.py +0 -0
  132. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/locking/filesystem.py +0 -0
  133. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/locking/memory.py +0 -0
  134. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/locking/protocol.py +0 -0
  135. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/__init__.py +0 -0
  136. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/configuration.py +0 -0
  137. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/filters.py +0 -0
  138. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/formatters.py +0 -0
  139. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/handlers.py +0 -0
  140. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/highlighters.py +0 -0
  141. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/loggers.py +0 -0
  142. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/logging/logging.yml +0 -0
  143. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/main.py +0 -0
  144. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/plugins.py +0 -0
  145. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/profiles.toml +0 -0
  146. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/py.typed +0 -0
  147. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/records/__init__.py +0 -0
  148. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/records/base.py +0 -0
  149. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/records/filesystem.py +0 -0
  150. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/records/memory.py +0 -0
  151. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/records/result_store.py +0 -0
  152. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/results.py +0 -0
  153. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/__init__.py +0 -0
  154. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/runner.py +0 -0
  155. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/server.py +0 -0
  156. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/storage.py +0 -0
  157. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/submit.py +0 -0
  158. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runner/utils.py +0 -0
  159. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runtime/__init__.py +0 -0
  160. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runtime/deployment.py +0 -0
  161. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runtime/flow_run.py +0 -0
  162. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/runtime/task_run.py +0 -0
  163. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/serializers.py +0 -0
  164. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
  165. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
  166. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/states.py +0 -0
  167. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/task_engine.py +0 -0
  168. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/task_runners.py +0 -0
  169. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/task_runs.py +0 -0
  170. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/task_worker.py +0 -0
  171. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/tasks.py +0 -0
  172. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/transactions.py +0 -0
  173. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/types/__init__.py +0 -0
  174. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/types/entrypoint.py +0 -0
  175. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/__init__.py +0 -0
  176. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/annotations.py +0 -0
  177. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/asyncutils.py +0 -0
  178. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/callables.py +0 -0
  179. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/compat.py +0 -0
  180. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/context.py +0 -0
  181. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/dispatch.py +0 -0
  182. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/dockerutils.py +0 -0
  183. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/engine.py +0 -0
  184. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/filesystem.py +0 -0
  185. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/hashing.py +0 -0
  186. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/importtools.py +0 -0
  187. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/math.py +0 -0
  188. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/names.py +0 -0
  189. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/processutils.py +0 -0
  190. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/pydantic.py +0 -0
  191. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/render_swagger.py +0 -0
  192. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/schema_tools/__init__.py +0 -0
  193. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/schema_tools/hydration.py +0 -0
  194. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/schema_tools/validation.py +0 -0
  195. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/services.py +0 -0
  196. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/slugify.py +0 -0
  197. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/templating.py +0 -0
  198. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/text.py +0 -0
  199. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/timeout.py +0 -0
  200. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/urls.py +0 -0
  201. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/utilities/visualization.py +0 -0
  202. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/variables.py +0 -0
  203. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/__init__.py +0 -0
  204. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/base.py +0 -0
  205. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/block.py +0 -0
  206. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/cloud.py +0 -0
  207. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/process.py +0 -0
  208. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/server.py +0 -0
  209. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect/workers/utilities.py +0 -0
  210. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect_client.egg-info/SOURCES.txt +0 -0
  211. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect_client.egg-info/dependency_links.txt +0 -0
  212. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect_client.egg-info/requires.txt +0 -0
  213. {prefect-client-3.0.7 → prefect-client-3.0.8}/src/prefect_client.egg-info/top_level.txt +0 -0
  214. {prefect-client-3.0.7 → prefect-client-3.0.8}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.7
3
+ Version: 3.0.8
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-10-09T17:55:58-0500",
11
+ "date": "2024-10-10T10:17:25-0500",
12
12
  "dirty": true,
13
13
  "error": null,
14
- "full-revisionid": "8fee9e1ef3f2b4f71adcf080bf9cb36db79c5f5a",
15
- "version": "3.0.7"
14
+ "full-revisionid": "0894bad49e256657cab8208205623c4c7b75ad1f",
15
+ "version": "3.0.8"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -10,7 +10,6 @@ After https://github.com/pydantic/pydantic/issues/9789 is resolved, we will be a
10
10
  for settings, at which point we will not need to use the "after" model_validator.
11
11
  """
12
12
 
13
- import inspect
14
13
  import os
15
14
  import re
16
15
  import sys
@@ -63,11 +62,7 @@ from typing_extensions import Literal, Self
63
62
 
64
63
  from prefect.exceptions import ProfileSettingsValidationError
65
64
  from prefect.types import ClientRetryExtraCodes, LogLevel
66
- from prefect.utilities.collections import (
67
- deep_merge_dicts,
68
- set_in_dict,
69
- visit_collection,
70
- )
65
+ from prefect.utilities.collections import visit_collection
71
66
  from prefect.utilities.pydantic import handle_secret_render
72
67
 
73
68
  T = TypeVar("T")
@@ -77,12 +72,10 @@ DEFAULT_PROFILES_PATH = Path(__file__).parent.joinpath("profiles.toml")
77
72
  _SECRET_TYPES: Tuple[Type, ...] = (Secret, SecretStr)
78
73
 
79
74
 
80
- def env_var_to_accessor(env_var: str) -> str:
75
+ def env_var_to_attr_name(env_var: str) -> str:
81
76
  """
82
- Convert an environment variable name to a settings accessor.
77
+ Convert an environment variable name to an attribute name.
83
78
  """
84
- if SETTING_VARIABLES.get(env_var) is not None:
85
- return SETTING_VARIABLES[env_var].accessor
86
79
  return env_var.replace("PREFECT_", "").lower()
87
80
 
88
81
 
@@ -94,21 +87,19 @@ def is_test_mode() -> bool:
94
87
  class Setting:
95
88
  """Mimics the old Setting object for compatibility with existing code."""
96
89
 
97
- def __init__(
98
- self, name: str, default: Any, type_: Any, accessor: Optional[str] = None
99
- ):
90
+ def __init__(self, name: str, default: Any, type_: Any):
100
91
  self._name = name
101
92
  self._default = default
102
93
  self._type = type_
103
- if accessor is None:
104
- self.accessor = env_var_to_accessor(name)
105
- else:
106
- self.accessor = accessor
107
94
 
108
95
  @property
109
96
  def name(self):
110
97
  return self._name
111
98
 
99
+ @property
100
+ def field_name(self):
101
+ return env_var_to_attr_name(self.name)
102
+
112
103
  @property
113
104
  def is_secret(self):
114
105
  if self._type in _SECRET_TYPES:
@@ -128,19 +119,13 @@ class Setting:
128
119
  else:
129
120
  return None
130
121
 
131
- path = self.accessor.split(".")
132
- current_value = get_current_settings()
133
- for key in path:
134
- current_value = getattr(current_value, key, None)
122
+ current_value = getattr(get_current_settings(), self.field_name)
135
123
  if isinstance(current_value, _SECRET_TYPES):
136
124
  return current_value.get_secret_value()
137
125
  return current_value
138
126
 
139
127
  def value_from(self: Self, settings: "Settings") -> Any:
140
- path = self.accessor.split(".")
141
- current_value = settings
142
- for key in path:
143
- current_value = getattr(current_value, key, None)
128
+ current_value = getattr(settings, self.field_name)
144
129
  if isinstance(current_value, _SECRET_TYPES):
145
130
  return current_value.get_secret_value()
146
131
  return current_value
@@ -172,7 +157,7 @@ def default_ui_url(settings: "Settings") -> Optional[str]:
172
157
  return value
173
158
 
174
159
  # Otherwise, infer a value from the API URL
175
- ui_url = api_url = settings.api.url
160
+ ui_url = api_url = settings.api_url
176
161
 
177
162
  if not api_url:
178
163
  return None
@@ -258,7 +243,7 @@ def warn_on_misconfigured_api_url(values):
258
243
  """
259
244
  Validator for settings warning if the API URL is misconfigured.
260
245
  """
261
- api_url = values.get("api", {}).get("url")
246
+ api_url = values["api_url"]
262
247
  if api_url is not None:
263
248
  misconfigured_mappings = {
264
249
  "app.prefect.cloud": (
@@ -403,9 +388,7 @@ class ProfileSettingsTomlLoader(PydanticBaseSettingsSource):
403
388
  self, field: FieldInfo, field_name: str
404
389
  ) -> Tuple[Any, str, bool]:
405
390
  """Concrete implementation to get the field value from the profile settings"""
406
- value = self.profile_settings.get(
407
- f"{self.config.get('env_prefix','')}{field_name.upper()}"
408
- )
391
+ value = self.profile_settings.get(f"PREFECT_{field_name.upper()}")
409
392
  return value, field_name, self.field_is_complex(field)
410
393
 
411
394
  def __call__(self) -> Dict[str, Any]:
@@ -425,7 +408,21 @@ class ProfileSettingsTomlLoader(PydanticBaseSettingsSource):
425
408
 
426
409
  ###########################################################################
427
410
  # Settings
428
- class PrefectBaseSettings(BaseSettings):
411
+
412
+
413
+ class Settings(BaseSettings):
414
+ """
415
+ Settings for Prefect using Pydantic settings.
416
+
417
+ See https://docs.pydantic.dev/latest/concepts/pydantic_settings
418
+ """
419
+
420
+ model_config = SettingsConfigDict(
421
+ env_file=".env",
422
+ env_prefix="PREFECT_",
423
+ extra="ignore",
424
+ )
425
+
429
426
  @classmethod
430
427
  def settings_customise_sources(
431
428
  cls,
@@ -450,104 +447,6 @@ class PrefectBaseSettings(BaseSettings):
450
447
  ProfileSettingsTomlLoader(settings_cls),
451
448
  )
452
449
 
453
- @classmethod
454
- def valid_setting_names(cls) -> Set[str]:
455
- """
456
- A set of valid setting names, e.g. "PREFECT_API_URL" or "PREFECT_API_KEY".
457
- """
458
- settings_fields = set()
459
- for field_name, field in cls.model_fields.items():
460
- if inspect.isclass(field.annotation) and issubclass(
461
- field.annotation, PrefectBaseSettings
462
- ):
463
- settings_fields.update(field.annotation.valid_setting_names())
464
- else:
465
- settings_fields.add(
466
- f"{cls.model_config.get('env_prefix')}{field_name.upper()}"
467
- )
468
- return settings_fields
469
-
470
- def to_environment_variables(
471
- self,
472
- exclude_unset: bool = False,
473
- include_secrets: bool = True,
474
- ) -> Dict[str, str]:
475
- """Convert the settings object to a dictionary of environment variables."""
476
-
477
- env: Dict[str, Any] = self.model_dump(
478
- exclude_unset=exclude_unset,
479
- mode="json",
480
- context={"include_secrets": include_secrets},
481
- )
482
- env_variables = {}
483
- for key, value in env.items():
484
- if isinstance(value, dict) and isinstance(
485
- child_settings := getattr(self, key), PrefectBaseSettings
486
- ):
487
- child_env = child_settings.to_environment_variables(
488
- exclude_unset=exclude_unset,
489
- include_secrets=include_secrets,
490
- )
491
- env_variables.update(child_env)
492
- elif value is not None:
493
- env_variables[
494
- f"{self.model_config.get('env_prefix')}{key.upper()}"
495
- ] = str(value)
496
- return env_variables
497
-
498
-
499
- class APISettings(PrefectBaseSettings):
500
- """
501
- Settings for interacting with the Prefect API
502
- """
503
-
504
- model_config = SettingsConfigDict(
505
- env_prefix="PREFECT_API_", env_file=".env", extra="ignore"
506
- )
507
- url: Optional[str] = Field(
508
- default=None,
509
- description="The URL of the Prefect API. If not set, the client will attempt to infer it.",
510
- )
511
- key: Optional[SecretStr] = Field(
512
- default=None,
513
- description="The API key used for authentication with the Prefect API. Should be kept secret.",
514
- )
515
- tls_insecure_skip_verify: bool = Field(
516
- default=False,
517
- description="If `True`, disables SSL checking to allow insecure requests. This is recommended only during development, e.g. when using self-signed certificates.",
518
- )
519
- ssl_cert_file: Optional[str] = Field(
520
- default=os.environ.get("SSL_CERT_FILE"),
521
- description="This configuration settings option specifies the path to an SSL certificate file.",
522
- )
523
- enable_http2: bool = Field(
524
- default=False,
525
- description="If true, enable support for HTTP/2 for communicating with an API. If the API does not support HTTP/2, this will have no effect and connections will be made via HTTP/1.1.",
526
- )
527
- request_timeout: float = Field(
528
- default=60.0,
529
- description="The default timeout for requests to the API",
530
- )
531
- default_limit: int = Field(
532
- default=200,
533
- description="The default limit applied to queries that can return multiple objects, such as `POST /flow_runs/filter`.",
534
- )
535
-
536
-
537
- class Settings(PrefectBaseSettings):
538
- """
539
- Settings for Prefect using Pydantic settings.
540
-
541
- See https://docs.pydantic.dev/latest/concepts/pydantic_settings
542
- """
543
-
544
- model_config = SettingsConfigDict(
545
- env_file=".env",
546
- env_prefix="PREFECT_",
547
- env_nested_delimiter=None,
548
- extra="ignore",
549
- )
550
-
551
450
  ###########################################################################
552
451
  # CLI
553
452
 
@@ -605,9 +504,33 @@ class Settings(PrefectBaseSettings):
605
504
  ###########################################################################
606
505
  # API settings
607
506
 
608
- api: APISettings = Field(
609
- default_factory=APISettings,
610
- description="Settings for interacting with the Prefect API",
507
+ api_url: Optional[str] = Field(
508
+ default=None,
509
+ description="The URL of the Prefect API. If not set, the client will attempt to infer it.",
510
+ )
511
+ api_key: Optional[SecretStr] = Field(
512
+ default=None,
513
+ description="The API key used for authentication with the Prefect API. Should be kept secret.",
514
+ )
515
+
516
+ api_tls_insecure_skip_verify: bool = Field(
517
+ default=False,
518
+ description="If `True`, disables SSL checking to allow insecure requests. This is recommended only during development, e.g. when using self-signed certificates.",
519
+ )
520
+
521
+ api_ssl_cert_file: Optional[str] = Field(
522
+ default=os.environ.get("SSL_CERT_FILE"),
523
+ description="This configuration settings option specifies the path to an SSL certificate file.",
524
+ )
525
+
526
+ api_enable_http2: bool = Field(
527
+ default=False,
528
+ description="If true, enable support for HTTP/2 for communicating with an API. If the API does not support HTTP/2, this will have no effect and connections will be made via HTTP/1.1.",
529
+ )
530
+
531
+ api_request_timeout: float = Field(
532
+ default=60.0,
533
+ description="The default timeout for requests to the API",
611
534
  )
612
535
 
613
536
  api_blocks_register_on_start: bool = Field(
@@ -1506,7 +1429,7 @@ class Settings(PrefectBaseSettings):
1506
1429
 
1507
1430
  def __getattribute__(self, name: str) -> Any:
1508
1431
  if name.startswith("PREFECT_"):
1509
- field_name = env_var_to_accessor(name)
1432
+ field_name = env_var_to_attr_name(name)
1510
1433
  warnings.warn(
1511
1434
  f"Accessing `Settings().{name}` is deprecated. Use `Settings().{field_name}` instead.",
1512
1435
  DeprecationWarning,
@@ -1533,10 +1456,8 @@ class Settings(PrefectBaseSettings):
1533
1456
  self.ui_url = default_ui_url(self)
1534
1457
  self.__pydantic_fields_set__.remove("ui_url")
1535
1458
  if self.ui_api_url is None:
1536
- if self.api.url:
1537
- self.ui_api_url = self.api.url
1538
- if self.api.url:
1539
- self.ui_api_url = self.api.url
1459
+ if self.api_url:
1460
+ self.ui_api_url = self.api_url
1540
1461
  self.__pydantic_fields_set__.remove("ui_api_url")
1541
1462
  else:
1542
1463
  self.ui_api_url = (
@@ -1600,6 +1521,16 @@ class Settings(PrefectBaseSettings):
1600
1521
  ##########################################################################
1601
1522
  # Settings methods
1602
1523
 
1524
+ @classmethod
1525
+ def valid_setting_names(cls) -> Set[str]:
1526
+ """
1527
+ A set of valid setting names, e.g. "PREFECT_API_URL" or "PREFECT_API_KEY".
1528
+ """
1529
+ return set(
1530
+ f"{cls.model_config.get('env_prefix')}{key.upper()}"
1531
+ for key in cls.model_fields.keys()
1532
+ )
1533
+
1603
1534
  def copy_with_update(
1604
1535
  self: Self,
1605
1536
  updates: Optional[Mapping[Setting, Any]] = None,
@@ -1619,26 +1550,14 @@ class Settings(PrefectBaseSettings):
1619
1550
  Returns:
1620
1551
  A new Settings object.
1621
1552
  """
1622
- restore_defaults_obj = {}
1623
- for r in restore_defaults or []:
1624
- set_in_dict(restore_defaults_obj, r.accessor, True)
1553
+ restore_defaults_names = set(r.field_name for r in restore_defaults or [])
1625
1554
  updates = updates or {}
1626
1555
  set_defaults = set_defaults or {}
1627
1556
 
1628
- set_defaults_obj = {}
1629
- for setting, value in set_defaults.items():
1630
- set_in_dict(set_defaults_obj, setting.accessor, value)
1631
-
1632
- updates_obj = {}
1633
- for setting, value in updates.items():
1634
- set_in_dict(updates_obj, setting.accessor, value)
1635
-
1636
1557
  new_settings = self.__class__(
1637
- **deep_merge_dicts(
1638
- set_defaults_obj,
1639
- self.model_dump(exclude_unset=True, exclude=restore_defaults_obj),
1640
- updates_obj,
1641
- )
1558
+ **{setting.field_name: value for setting, value in set_defaults.items()}
1559
+ | self.model_dump(exclude_unset=True, exclude=restore_defaults_names)
1560
+ | {setting.field_name: value for setting, value in updates.items()}
1642
1561
  )
1643
1562
  return new_settings
1644
1563
 
@@ -1650,6 +1569,37 @@ class Settings(PrefectBaseSettings):
1650
1569
  env_variables = self.to_environment_variables()
1651
1570
  return str(hash(tuple((key, value) for key, value in env_variables.items())))
1652
1571
 
1572
+ def to_environment_variables(
1573
+ self,
1574
+ include: Optional[Iterable[Setting]] = None,
1575
+ exclude: Optional[Iterable[Setting]] = None,
1576
+ exclude_unset: bool = False,
1577
+ include_secrets: bool = True,
1578
+ ) -> Dict[str, str]:
1579
+ """Convert the settings object to a dictionary of environment variables."""
1580
+ included_names = {s.field_name for s in include} if include else None
1581
+ excluded_names = {s.field_name for s in exclude} if exclude else None
1582
+
1583
+ if exclude_unset:
1584
+ if included_names is None:
1585
+ included_names = set(self.model_dump(exclude_unset=True).keys())
1586
+ else:
1587
+ included_names.intersection_update(
1588
+ {key for key in self.model_dump(exclude_unset=True)}
1589
+ )
1590
+
1591
+ env: Dict[str, Any] = self.model_dump(
1592
+ include=included_names,
1593
+ exclude=excluded_names,
1594
+ mode="json",
1595
+ context={"include_secrets": include_secrets},
1596
+ )
1597
+ return {
1598
+ f"{self.model_config.get('env_prefix')}{key.upper()}": str(value)
1599
+ for key, value in env.items()
1600
+ if value is not None
1601
+ }
1602
+
1653
1603
  @model_serializer(
1654
1604
  mode="wrap", when_used="always"
1655
1605
  ) # TODO: reconsider `when_used` default for more control
@@ -1659,11 +1609,7 @@ class Settings(PrefectBaseSettings):
1659
1609
  ctx = info.context
1660
1610
  jsonable_self = handler(self)
1661
1611
  if ctx and ctx.get("include_secrets") is True:
1662
- dump_kwargs = dict(
1663
- include=info.include,
1664
- exclude=info.exclude,
1665
- exclude_unset=info.exclude_unset,
1666
- )
1612
+ dump_kwargs = dict(include=info.include, exclude=info.exclude)
1667
1613
  jsonable_self.update(
1668
1614
  {
1669
1615
  field_name: visit_collection(
@@ -1693,7 +1639,12 @@ def _cast_settings(
1693
1639
  for k, value in settings.items():
1694
1640
  try:
1695
1641
  if isinstance(k, str):
1696
- setting = SETTING_VARIABLES[k]
1642
+ field = Settings.model_fields[env_var_to_attr_name(k)]
1643
+ setting = Setting(
1644
+ name=k,
1645
+ default=field.default,
1646
+ type_=field.annotation,
1647
+ )
1697
1648
  else:
1698
1649
  setting = k
1699
1650
  casted_settings[setting] = value
@@ -1788,16 +1739,9 @@ class Profile(BaseModel):
1788
1739
  errors: List[Tuple[Setting, ValidationError]] = []
1789
1740
  for setting, value in self.settings.items():
1790
1741
  try:
1791
- model_fields = Settings.model_fields
1792
- annotation = None
1793
- for section in setting.accessor.split("."):
1794
- annotation = model_fields[section].annotation
1795
- if inspect.isclass(annotation) and issubclass(
1796
- annotation, BaseSettings
1797
- ):
1798
- model_fields = annotation.model_fields
1799
-
1800
- TypeAdapter(annotation).validate_python(value)
1742
+ TypeAdapter(
1743
+ Settings.model_fields[setting.field_name].annotation
1744
+ ).validate_python(value)
1801
1745
  except ValidationError as e:
1802
1746
  errors.append((setting, e))
1803
1747
  if errors:
@@ -2114,38 +2058,26 @@ def update_current_profile(
2114
2058
  # Allow traditional env var access
2115
2059
 
2116
2060
 
2117
- def _collect_settings_fields(
2118
- settings_cls: Type[BaseSettings], accessor_prefix: Optional[str] = None
2119
- ) -> Dict[str, Setting]:
2120
- settings_fields: Dict[str, Setting] = {}
2121
- for field_name, field in settings_cls.model_fields.items():
2122
- if inspect.isclass(field.annotation) and issubclass(
2123
- field.annotation, BaseSettings
2124
- ):
2125
- accessor = (
2126
- field_name
2127
- if accessor_prefix is None
2128
- else f"{accessor_prefix}.{field_name}"
2129
- )
2130
- settings_fields.update(_collect_settings_fields(field.annotation, accessor))
2131
- else:
2132
- accessor = (
2133
- field_name
2134
- if accessor_prefix is None
2135
- else f"{accessor_prefix}.{field_name}"
2136
- )
2061
+ class _SettingsDict(dict):
2062
+ """allow either `field_name` or `ENV_VAR_NAME` access
2063
+ ```
2064
+ d = _SettingsDict(Settings)
2065
+ d["api_url"] == d["PREFECT_API_URL"]
2066
+ ```
2067
+ """
2068
+
2069
+ def __init__(self: Self, settings_cls: Type[BaseSettings]):
2070
+ super().__init__()
2071
+ for field_name, field in settings_cls.model_fields.items():
2137
2072
  setting = Setting(
2138
2073
  name=f"{settings_cls.model_config.get('env_prefix')}{field_name.upper()}",
2139
2074
  default=field.default,
2140
2075
  type_=field.annotation,
2141
- accessor=accessor,
2142
2076
  )
2143
- settings_fields[setting.name] = setting
2144
- settings_fields[setting.accessor] = setting
2145
- return settings_fields
2077
+ self[field_name] = self[setting.name] = setting
2146
2078
 
2147
2079
 
2148
- SETTING_VARIABLES: dict[str, Setting] = _collect_settings_fields(Settings)
2080
+ SETTING_VARIABLES: dict[str, Setting] = _SettingsDict(Settings)
2149
2081
 
2150
2082
 
2151
2083
  def __getattr__(name: str) -> Setting:
@@ -513,73 +513,3 @@ def get_from_dict(dct: Dict, keys: Union[str, List[str]], default: Any = None) -
513
513
  return dct
514
514
  except (TypeError, KeyError, IndexError):
515
515
  return default
516
-
517
-
518
- def set_in_dict(dct: Dict, keys: Union[str, List[str]], value: Any):
519
- """
520
- Sets a value in a nested dictionary using a sequence of keys.
521
-
522
- This function allows to set a value in a deeply nested structure
523
- of dictionaries and lists using either a dot-separated string or a list
524
- of keys. If a requested key does not exist, the function will create it as
525
- a new dictionary.
526
-
527
- Args:
528
- dct: The dictionary to set the value in.
529
- keys: The sequence of keys to use for access. Can be a
530
- dot-separated string or a list of keys.
531
- value: The value to set in the dictionary.
532
-
533
- Returns:
534
- The modified dictionary with the value set at the specified key path.
535
-
536
- Raises:
537
- KeyError: If the key path exists and is not a dictionary.
538
- """
539
- if isinstance(keys, str):
540
- keys = keys.replace("[", ".").replace("]", "").split(".")
541
- for k in keys[:-1]:
542
- if not isinstance(dct.get(k, {}), dict):
543
- raise KeyError(f"Key path exists and contains a non-dict value: {keys}")
544
- if k not in dct:
545
- dct[k] = {}
546
- dct = dct[k]
547
- dct[keys[-1]] = value
548
-
549
-
550
- def deep_merge(dct: Dict, merge: Dict):
551
- """
552
- Recursively merges `merge` into `dct`.
553
-
554
- Args:
555
- dct: The dictionary to merge into.
556
- merge: The dictionary to merge from.
557
-
558
- Returns:
559
- A new dictionary with the merged contents.
560
- """
561
- result = dct.copy() # Start with keys and values from `dct`
562
- for key, value in merge.items():
563
- if key in result and isinstance(result[key], dict) and isinstance(value, dict):
564
- # If both values are dictionaries, merge them recursively
565
- result[key] = deep_merge(result[key], value)
566
- else:
567
- # Otherwise, overwrite with the new value
568
- result[key] = value
569
- return result
570
-
571
-
572
- def deep_merge_dicts(*dicts):
573
- """
574
- Recursively merges multiple dictionaries.
575
-
576
- Args:
577
- dicts: The dictionaries to merge.
578
-
579
- Returns:
580
- A new dictionary with the merged contents.
581
- """
582
- result = {}
583
- for dictionary in dicts:
584
- result = deep_merge(result, dictionary)
585
- return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.7
3
+ Version: 3.0.8
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
File without changes
File without changes
File without changes
File without changes