prefect-client 3.1.1__py3-none-any.whl → 3.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
prefect/_version.py CHANGED
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2024-11-08T12:38:16-0800",
11
+ "date": "2024-11-12T13:38:45-0800",
12
12
  "dirty": true,
13
13
  "error": null,
14
- "full-revisionid": "6b50a2b9f9d4ebf59703c55e1156c6f79151f1c3",
15
- "version": "3.1.1"
14
+ "full-revisionid": "02b99f0a756f0395e4292952dcb2d963fc839750",
15
+ "version": "3.1.2"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
prefect/client/cloud.py CHANGED
@@ -1,5 +1,6 @@
1
1
  import re
2
2
  from typing import Any, Dict, List, Optional, cast
3
+ from uuid import UUID
3
4
 
4
5
  import anyio
5
6
  import httpx
@@ -12,6 +13,7 @@ from prefect.client.base import PrefectHttpxAsyncClient
12
13
  from prefect.client.schemas.objects import (
13
14
  IPAllowlist,
14
15
  IPAllowlistMyAccessResponse,
16
+ KeyValueLabels,
15
17
  Workspace,
16
18
  )
17
19
  from prefect.exceptions import ObjectNotFound, PrefectException
@@ -151,6 +153,25 @@ class CloudClient:
151
153
  response = await self.get(f"{self.account_base_url}/ip_allowlist/my_access")
152
154
  return IPAllowlistMyAccessResponse.model_validate(response)
153
155
 
156
+ async def update_flow_run_labels(
157
+ self, flow_run_id: UUID, labels: KeyValueLabels
158
+ ) -> httpx.Response:
159
+ """
160
+ Update the labels for a flow run.
161
+
162
+ Args:
163
+ flow_run_id: The identifier for the flow run to update.
164
+ labels: A dictionary of labels to update for the flow run.
165
+
166
+ Returns:
167
+ an `httpx.Response` object from the PATCH request
168
+ """
169
+
170
+ return await self._client.patch(
171
+ f"{self.workspace_base_url}/flow_runs/{flow_run_id}/labels",
172
+ json=labels,
173
+ )
174
+
154
175
  async def __aenter__(self):
155
176
  await self._client.__aenter__()
156
177
  return self
@@ -2613,7 +2613,7 @@ class PrefectClient:
2613
2613
  "heartbeat_interval_seconds": heartbeat_interval_seconds,
2614
2614
  }
2615
2615
  if worker_metadata:
2616
- params["worker_metadata"] = worker_metadata.model_dump(mode="json")
2616
+ params["metadata"] = worker_metadata.model_dump(mode="json")
2617
2617
  if get_worker_id:
2618
2618
  params["return_id"] = get_worker_id
2619
2619
 
@@ -23,6 +23,9 @@ from pydantic import (
23
23
  HttpUrl,
24
24
  IPvAnyNetwork,
25
25
  SerializationInfo,
26
+ StrictBool,
27
+ StrictFloat,
28
+ StrictInt,
26
29
  Tag,
27
30
  field_validator,
28
31
  model_serializer,
@@ -68,6 +71,8 @@ if TYPE_CHECKING:
68
71
 
69
72
  R = TypeVar("R", default=Any)
70
73
 
74
+ KeyValueLabels = dict[str, Union[StrictBool, StrictInt, StrictFloat, str]]
75
+
71
76
 
72
77
  DEFAULT_BLOCK_SCHEMA_VERSION = "non-versioned"
73
78
  DEFAULT_AGENT_WORK_POOL_NAME = "default-agent-pool"
prefect/settings/base.py CHANGED
@@ -17,6 +17,7 @@ from pydantic_settings import (
17
17
 
18
18
  from prefect.settings.sources import (
19
19
  EnvFilterSettingsSource,
20
+ FilteredDotEnvSettingsSource,
20
21
  PrefectTomlConfigSettingsSource,
21
22
  ProfileSettingsTomlLoader,
22
23
  PyprojectTomlConfigSettingsSource,
@@ -43,13 +44,14 @@ class PrefectBaseSettings(BaseSettings):
43
44
  See https://docs.pydantic.dev/latest/concepts/pydantic_settings/#customise-settings-sources
44
45
  """
45
46
  env_filter = set()
46
- for field in settings_cls.model_fields.values():
47
+ for field_name, field in settings_cls.model_fields.items():
47
48
  if field.validation_alias is not None and isinstance(
48
49
  field.validation_alias, AliasChoices
49
50
  ):
50
51
  for alias in field.validation_alias.choices:
51
52
  if isinstance(alias, AliasPath) and len(alias.path) > 0:
52
53
  env_filter.add(alias.path[0])
54
+ env_filter.add(field_name)
53
55
  return (
54
56
  init_settings,
55
57
  EnvFilterSettingsSource(
@@ -62,7 +64,18 @@ class PrefectBaseSettings(BaseSettings):
62
64
  env_parse_enums=cls.model_config.get("env_parse_enums"),
63
65
  env_filter=list(env_filter),
64
66
  ),
65
- dotenv_settings,
67
+ FilteredDotEnvSettingsSource(
68
+ settings_cls,
69
+ env_file=cls.model_config.get("env_file"),
70
+ env_file_encoding=cls.model_config.get("env_file_encoding"),
71
+ case_sensitive=cls.model_config.get("case_sensitive"),
72
+ env_prefix=cls.model_config.get("env_prefix"),
73
+ env_nested_delimiter=cls.model_config.get("env_nested_delimiter"),
74
+ env_ignore_empty=cls.model_config.get("env_ignore_empty"),
75
+ env_parse_none_str=cls.model_config.get("env_parse_none_str"),
76
+ env_parse_enums=cls.model_config.get("env_parse_enums"),
77
+ env_blacklist=list(env_filter),
78
+ ),
66
79
  file_secret_settings,
67
80
  PrefectTomlConfigSettingsSource(settings_cls),
68
81
  PyprojectTomlConfigSettingsSource(settings_cls),
@@ -92,7 +105,7 @@ class PrefectBaseSettings(BaseSettings):
92
105
  elif (value := env.get(key)) is not None:
93
106
  env_variables[
94
107
  f"{self.model_config.get('env_prefix')}{key.upper()}"
95
- ] = str(value)
108
+ ] = _to_environment_variable_value(value)
96
109
  return env_variables
97
110
 
98
111
  @model_serializer(
@@ -191,3 +204,9 @@ def _build_settings_config(
191
204
  pyproject_toml_table_header=("tool", "prefect", *path),
192
205
  json_schema_extra=_add_environment_variables,
193
206
  )
207
+
208
+
209
+ def _to_environment_variable_value(value: Any) -> str:
210
+ if isinstance(value, (list, set, tuple)):
211
+ return ",".join(str(v) for v in value)
212
+ return str(value)
@@ -10,10 +10,15 @@ from pydantic import AliasChoices
10
10
  from pydantic.fields import FieldInfo
11
11
  from pydantic_settings import (
12
12
  BaseSettings,
13
+ DotEnvSettingsSource,
13
14
  EnvSettingsSource,
14
15
  PydanticBaseSettingsSource,
15
16
  )
16
- from pydantic_settings.sources import ConfigFileSourceMixin
17
+ from pydantic_settings.sources import (
18
+ ENV_FILE_SENTINEL,
19
+ ConfigFileSourceMixin,
20
+ DotenvType,
21
+ )
17
22
 
18
23
  from prefect.settings.constants import DEFAULT_PREFECT_HOME, DEFAULT_PROFILES_PATH
19
24
  from prefect.utilities.collections import get_from_dict
@@ -61,6 +66,44 @@ class EnvFilterSettingsSource(EnvSettingsSource):
61
66
  }
62
67
 
63
68
 
69
+ class FilteredDotEnvSettingsSource(DotEnvSettingsSource):
70
+ def __init__(
71
+ self,
72
+ settings_cls: type[BaseSettings],
73
+ env_file: Optional[DotenvType] = ENV_FILE_SENTINEL,
74
+ env_file_encoding: Optional[str] = None,
75
+ case_sensitive: Optional[bool] = None,
76
+ env_prefix: Optional[str] = None,
77
+ env_nested_delimiter: Optional[str] = None,
78
+ env_ignore_empty: Optional[bool] = None,
79
+ env_parse_none_str: Optional[str] = None,
80
+ env_parse_enums: Optional[bool] = None,
81
+ env_blacklist: Optional[List[str]] = None,
82
+ ) -> None:
83
+ super().__init__(
84
+ settings_cls,
85
+ env_file,
86
+ env_file_encoding,
87
+ case_sensitive,
88
+ env_prefix,
89
+ env_nested_delimiter,
90
+ env_ignore_empty,
91
+ env_parse_none_str,
92
+ env_parse_enums,
93
+ )
94
+ self.env_blacklist = env_blacklist
95
+ if self.env_blacklist:
96
+ if isinstance(self.env_vars, dict):
97
+ for key in self.env_blacklist:
98
+ self.env_vars.pop(key, None)
99
+ else:
100
+ self.env_vars = {
101
+ key: value
102
+ for key, value in self.env_vars.items() # type: ignore
103
+ if key.lower() not in env_blacklist
104
+ }
105
+
106
+
64
107
  class ProfileSettingsTomlLoader(PydanticBaseSettingsSource):
65
108
  """
66
109
  Custom pydantic settings source to load profile settings from a toml file.
@@ -111,21 +154,34 @@ class ProfileSettingsTomlLoader(PydanticBaseSettingsSource):
111
154
  ) -> Tuple[Any, str, bool]:
112
155
  """Concrete implementation to get the field value from the profile settings"""
113
156
  if field.validation_alias:
157
+ # Use validation alias as the key to ensure profile value does not
158
+ # higher priority sources. Lower priority sources that use the
159
+ # field name can override higher priority sources that use the
160
+ # validation alias as seen in https://github.com/PrefectHQ/prefect/issues/15981
114
161
  if isinstance(field.validation_alias, str):
115
162
  value = self.profile_settings.get(field.validation_alias.upper())
116
163
  if value is not None:
117
- return value, field_name, self.field_is_complex(field)
164
+ return value, field.validation_alias, self.field_is_complex(field)
118
165
  elif isinstance(field.validation_alias, AliasChoices):
166
+ value = None
167
+ lowest_priority_alias = next(
168
+ choice
169
+ for choice in reversed(field.validation_alias.choices)
170
+ if isinstance(choice, str)
171
+ )
119
172
  for alias in field.validation_alias.choices:
120
173
  if not isinstance(alias, str):
121
174
  continue
122
175
  value = self.profile_settings.get(alias.upper())
123
176
  if value is not None:
124
- return value, field_name, self.field_is_complex(field)
125
-
126
- value = self.profile_settings.get(
127
- f"{self.config.get('env_prefix','')}{field_name.upper()}"
128
- )
177
+ return (
178
+ value,
179
+ lowest_priority_alias,
180
+ self.field_is_complex(field),
181
+ )
182
+
183
+ name = f"{self.config.get('env_prefix','')}{field_name.upper()}"
184
+ value = self.profile_settings.get(name)
129
185
  return value, field_name, self.field_is_complex(field)
130
186
 
131
187
  def __call__(self) -> Dict[str, Any]:
@@ -164,7 +220,22 @@ class TomlConfigSettingsSourceBase(PydanticBaseSettingsSource, ConfigFileSourceM
164
220
  # if the value is a dict, it is likely a nested settings object and a nested
165
221
  # source will handle it
166
222
  value = None
167
- return value, field_name, self.field_is_complex(field)
223
+ name = field_name
224
+ # Use validation alias as the key to ensure profile value does not
225
+ # higher priority sources. Lower priority sources that use the
226
+ # field name can override higher priority sources that use the
227
+ # validation alias as seen in https://github.com/PrefectHQ/prefect/issues/15981
228
+ if value is not None:
229
+ if field.validation_alias and isinstance(field.validation_alias, str):
230
+ name = field.validation_alias
231
+ elif field.validation_alias and isinstance(
232
+ field.validation_alias, AliasChoices
233
+ ):
234
+ for alias in reversed(field.validation_alias.choices):
235
+ if isinstance(alias, str):
236
+ name = alias
237
+ break
238
+ return value, name, self.field_is_complex(field)
168
239
 
169
240
  def __call__(self) -> Dict[str, Any]:
170
241
  """Called by pydantic to get the settings from our custom source"""
prefect/states.py CHANGED
@@ -2,6 +2,7 @@ import asyncio
2
2
  import datetime
3
3
  import sys
4
4
  import traceback
5
+ import uuid
5
6
  import warnings
6
7
  from collections import Counter
7
8
  from types import GeneratorType, TracebackType
@@ -220,7 +221,8 @@ async def exception_to_crashed_state(
220
221
  )
221
222
 
222
223
  if result_store:
223
- data = result_store.create_result_record(exc)
224
+ key = uuid.uuid4().hex
225
+ data = result_store.create_result_record(exc, key=key)
224
226
  else:
225
227
  # Attach the exception for local usage, will not be available when retrieved
226
228
  # from the API
@@ -253,7 +255,8 @@ async def exception_to_failed_state(
253
255
  pass
254
256
 
255
257
  if result_store:
256
- data = result_store.create_result_record(exc)
258
+ key = uuid.uuid4().hex
259
+ data = result_store.create_result_record(exc, key=key)
257
260
  if write_result:
258
261
  try:
259
262
  await result_store.apersist_result_record(data)
prefect/utilities/urls.py CHANGED
@@ -2,7 +2,8 @@ import inspect
2
2
  import ipaddress
3
3
  import socket
4
4
  import urllib.parse
5
- from typing import TYPE_CHECKING, Any, Literal, Optional, Union
5
+ from string import Formatter
6
+ from typing import TYPE_CHECKING, Any, Dict, Literal, Optional, Union
6
7
  from urllib.parse import urlparse
7
8
  from uuid import UUID
8
9
 
@@ -22,7 +23,6 @@ logger = get_logger("utilities.urls")
22
23
 
23
24
  # The following objects are excluded from UI URL generation because we lack a
24
25
  # directly-addressable URL:
25
- # worker
26
26
  # artifact
27
27
  # variable
28
28
  # saved-search
@@ -38,6 +38,7 @@ UI_URL_FORMATS = {
38
38
  "deployment": "deployments/deployment/{obj_id}",
39
39
  "automation": "automations/automation/{obj_id}",
40
40
  "received-event": "events/event/{occurred}/{obj_id}",
41
+ "worker": "work-pools/work-pool/{work_pool_name}/worker/{obj_id}",
41
42
  }
42
43
 
43
44
  # The following objects are excluded from API URL generation because we lack a
@@ -134,6 +135,7 @@ def url_for(
134
135
  obj_id: Optional[Union[str, UUID]] = None,
135
136
  url_type: URLType = "ui",
136
137
  default_base_url: Optional[str] = None,
138
+ **additional_format_kwargs: Optional[Dict[str, Any]],
137
139
  ) -> Optional[str]:
138
140
  """
139
141
  Returns the URL for a Prefect object.
@@ -149,6 +151,8 @@ def url_for(
149
151
  Whether to return the URL for the UI (default) or API.
150
152
  default_base_url (str, optional):
151
153
  The default base URL to use if no URL is configured.
154
+ additional_format_kwargs (Dict[str, Any], optional):
155
+ Additional keyword arguments to pass to the URL format.
152
156
 
153
157
  Returns:
154
158
  Optional[str]: The URL for the given object or None if the object is not supported.
@@ -246,7 +250,18 @@ def url_for(
246
250
  occurred=obj.occurred.strftime("%Y-%m-%d"), obj_id=obj_id
247
251
  )
248
252
  else:
249
- url = url_format.format(obj_id=obj_id)
253
+ obj_keys = [
254
+ fname
255
+ for _, fname, _, _ in Formatter().parse(url_format)
256
+ if fname is not None and fname != "obj_id"
257
+ ]
258
+
259
+ if not all(key in additional_format_kwargs for key in obj_keys):
260
+ raise ValueError(
261
+ f"Unable to generate URL for {name} because the following keys are missing: {', '.join(obj_keys)}"
262
+ )
263
+
264
+ url = url_format.format(obj_id=obj_id, **additional_format_kwargs)
250
265
 
251
266
  if not base_url.endswith("/"):
252
267
  base_url += "/"
prefect/workers/base.py CHANGED
@@ -18,6 +18,7 @@ from typing_extensions import Literal
18
18
  import prefect
19
19
  from prefect._internal.schemas.validators import return_v_or_none
20
20
  from prefect.client.base import ServerType
21
+ from prefect.client.cloud import CloudClient, get_cloud_client
21
22
  from prefect.client.orchestration import PrefectClient, get_client
22
23
  from prefect.client.schemas.actions import WorkPoolCreate, WorkPoolUpdate
23
24
  from prefect.client.schemas.objects import (
@@ -439,6 +440,7 @@ class BaseWorker(abc.ABC):
439
440
  self._exit_stack: AsyncExitStack = AsyncExitStack()
440
441
  self._runs_task_group: Optional[anyio.abc.TaskGroup] = None
441
442
  self._client: Optional[PrefectClient] = None
443
+ self._cloud_client: Optional[CloudClient] = None
442
444
  self._last_polled_time: pendulum.DateTime = pendulum.now("utc")
443
445
  self._limit = limit
444
446
  self._limiter: Optional[anyio.CapacityLimiter] = None
@@ -630,9 +632,14 @@ class BaseWorker(abc.ABC):
630
632
  raise ValueError("`PREFECT_API_URL` must be set to start a Worker.")
631
633
 
632
634
  self._client = get_client()
635
+
633
636
  await self._exit_stack.enter_async_context(self._client)
634
637
  await self._exit_stack.enter_async_context(self._runs_task_group)
635
638
 
639
+ if self._client.server_type == ServerType.CLOUD:
640
+ self._cloud_client = get_cloud_client()
641
+ await self._exit_stack.enter_async_context(self._cloud_client)
642
+
636
643
  self.is_setup = True
637
644
 
638
645
  async def teardown(self, *exc_info):
@@ -740,7 +747,8 @@ class BaseWorker(abc.ABC):
740
747
  for dist in distributions()
741
748
  # PyPI packages often use dashes, but Python package names use underscores
742
749
  # because they must be valid identifiers.
743
- if dist.metadata.get("Name").replace("-", "_") in installed_integrations
750
+ if (name := dist.metadata.get("Name"))
751
+ and (name.replace("-", "_") in installed_integrations)
744
752
  ]
745
753
 
746
754
  if integration_versions:
@@ -877,12 +885,18 @@ class BaseWorker(abc.ABC):
877
885
  get_current_settings().experiments.worker_logging_to_api_enabled
878
886
  and self.backend_id
879
887
  ):
880
- worker_path = f"worker/{self.backend_id}"
881
- base_url = url_for("work-pool", self._work_pool.id)
888
+ try:
889
+ worker_url = url_for(
890
+ "worker",
891
+ obj_id=self.backend_id,
892
+ work_pool_name=self._work_pool_name,
893
+ )
882
894
 
883
- run_logger.info(
884
- f"Running on worker id: {self.backend_id}. See worker logs here: {base_url}/{worker_path}"
885
- )
895
+ run_logger.info(
896
+ f"Running on worker id: {self.backend_id}. See worker logs here: {worker_url}"
897
+ )
898
+ except ValueError as ve:
899
+ run_logger.warning(f"Failed to generate worker URL: {ve}")
886
900
 
887
901
  self._submitting_flow_run_ids.add(flow_run.id)
888
902
  self._runs_task_group.start_soon(
@@ -970,6 +984,7 @@ class BaseWorker(abc.ABC):
970
984
  try:
971
985
  configuration = await self._get_configuration(flow_run)
972
986
  submitted_event = self._emit_flow_run_submitted_event(configuration)
987
+ await self._give_worker_labels_to_flow_run(flow_run.id)
973
988
  result = await self.run(
974
989
  flow_run=flow_run,
975
990
  task_status=task_status,
@@ -1191,6 +1206,19 @@ class BaseWorker(abc.ABC):
1191
1206
 
1192
1207
  await self._runs_task_group.start(wrapper)
1193
1208
 
1209
+ async def _give_worker_labels_to_flow_run(self, flow_run_id: UUID):
1210
+ """
1211
+ Give this worker's identifying labels to the specified flow run.
1212
+ """
1213
+ if self._cloud_client:
1214
+ await self._cloud_client.update_flow_run_labels(
1215
+ flow_run_id,
1216
+ {
1217
+ "prefect.worker.name": self.name,
1218
+ "prefect.worker.type": self.type,
1219
+ },
1220
+ )
1221
+
1194
1222
  async def __aenter__(self):
1195
1223
  self._logger.debug("Entering worker context...")
1196
1224
  await self.setup()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.1.1
3
+ Version: 3.1.2
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -1,6 +1,6 @@
1
1
  prefect/.prefectignore,sha256=awSprvKT0vI8a64mEOLrMxhxqcO-b0ERQeYpA2rNKVQ,390
2
2
  prefect/__init__.py,sha256=UZPTpdap8ECK1zLoggfeOtZGkKcf6um1-lMb-nn4o5I,3450
3
- prefect/_version.py,sha256=l2zyL-F66iaGpmwpxB6wRww__gYWl19cPDqMKnOCZ2w,496
3
+ prefect/_version.py,sha256=bglRMlWNqQBudSTba4t4FcS844kr38QYKku_fRWBhcI,496
4
4
  prefect/agent.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
5
5
  prefect/artifacts.py,sha256=dsxFWmdg2r9zbHM3KgKOR5YbJ29_dXUYF9kipJpbxkE,13009
6
6
  prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
@@ -18,7 +18,7 @@ prefect/plugins.py,sha256=HY7Z7OJlltqzsUiPMEL1Y_hQbHw0CeZKayWiK-k8DP4,2435
18
18
  prefect/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  prefect/results.py,sha256=D8pjiiK0btWuTSQ4txw4glB4VFxvdrqef6z51-JgU5c,47670
20
20
  prefect/serializers.py,sha256=Lo41EM0_qGzcfB_63390Izeo3DdK6cY6VZfxa9hpSGQ,8712
21
- prefect/states.py,sha256=Aq4eZgsTTnCxxcBOMm9mlW-iIBldygD0KC_nW_aBriY,24871
21
+ prefect/states.py,sha256=ttqH5QhV1SjT2mUAiypEaK_7D-0yI2XGmMCaazuwBYY,24963
22
22
  prefect/task_engine.py,sha256=U9ukpUFYMEQffZ_5_TD4GEpqnxP4EIdw9Ye1W5GrrXA,58339
23
23
  prefect/task_runners.py,sha256=xg2oYPLC8XgpprMtC4xKAd1tRTcpjuxDQeq6oZtxujU,15199
24
24
  prefect/task_runs.py,sha256=jkaQOkRKOHS8fgHUijteriFpjMSKv4zldn1D8tZHkUI,8777
@@ -67,16 +67,16 @@ prefect/blocks/system.py,sha256=OacB-LLXaNiLY49bPx7aAjmvdEdBxNoaOdzsCUcDr2c,4563
67
67
  prefect/blocks/webhook.py,sha256=F0u1WSO17Gda8qwr9gYaA84Nfc8Qkic6HhhJMYXRzug,2496
68
68
  prefect/client/__init__.py,sha256=fFtCXsGIsBCsAMFKlUPgRVUoIeqq_CsGtFE1knhbHlU,593
69
69
  prefect/client/base.py,sha256=2K8UiWzorZNNM4c8c-OiGeZ5i5ViUfZ_Q31oPobbOO0,24956
70
- prefect/client/cloud.py,sha256=P8GctOSRqrukU_j9iXDuOW9lIiscRFP6WLxASDcmn_o,6207
70
+ prefect/client/cloud.py,sha256=v2Ir54cv2LnXdS9kmJsgxzlU9c5QYFTAjPRjghdqSQg,6819
71
71
  prefect/client/collections.py,sha256=u-96saqu0RALAazRI0YaZCJahnuafMppY21KN6ggx80,1059
72
72
  prefect/client/constants.py,sha256=Z_GG8KF70vbbXxpJuqW5pLnwzujTVeHbcYYRikNmGH0,29
73
- prefect/client/orchestration.py,sha256=p3vblcSgrle4p-_Rl99GDz1sNzH-2pltxYUZHbFwUeM,151496
73
+ prefect/client/orchestration.py,sha256=V2oj5PVfv5X8l3hNxoKHrThJ1E1uli90o_O5qC7bN9c,151489
74
74
  prefect/client/subscriptions.py,sha256=oqF2MJsgN3psJg-MePfvwMtEWjromfP9StWF00xc1eg,3403
75
75
  prefect/client/utilities.py,sha256=89fmza0cRMOayxgXRdO51TKb11TczJ0ByOZmcZVrt44,3286
76
76
  prefect/client/schemas/__init__.py,sha256=KlyqFV-hMulMkNstBn_0ijoHoIwJZaBj6B1r07UmgvE,607
77
77
  prefect/client/schemas/actions.py,sha256=m2HJr9oAoK9vqigCHSwMGwvKPTjGNEtP0xdXgforIT0,28629
78
78
  prefect/client/schemas/filters.py,sha256=ynzD3mdvHHkI51pJ_NWgeDv8Awr7-2QtpUq7fTInEYM,36316
79
- prefect/client/schemas/objects.py,sha256=H3yeFyyV3LGRe6IA8Yj-1RxpVgSfqVhodOQ6YhuIcXI,56629
79
+ prefect/client/schemas/objects.py,sha256=CJCMc9XrxM2EZliyvNRJdtYz8ZaI948wPFG3-BMXQdg,56753
80
80
  prefect/client/schemas/responses.py,sha256=tV06W8npA8oCjV9d0ZNvjro4QcbHxayb8PC4LmanXjo,15467
81
81
  prefect/client/schemas/schedules.py,sha256=8rpqjOYtknu2-1n5_WD4cOplgu93P3mCyX86B22LfL4,13070
82
82
  prefect/client/schemas/sorting.py,sha256=L-2Mx-igZPtsUoRUguTcG3nIEstMEMPD97NwPM2Ox5s,2579
@@ -160,13 +160,13 @@ prefect/runtime/task_run.py,sha256=B6v_nZiHy9nKZfnKFQF7izZjAjaiZOT0j80m-VcLxmY,3
160
160
  prefect/server/api/collections_data/views/aggregate-worker-metadata.json,sha256=gqrwGyylzBEzlFSPOJcMuUwdoK_zojpU0SZaBDgK5FE,79748
161
161
  prefect/server/api/static/prefect-logo-mark-gradient.png,sha256=ylRjJkI_JHCw8VbQasNnXQHwZW-sH-IQiUGSD3aWP1E,73430
162
162
  prefect/settings/__init__.py,sha256=NU9Qyq0DJDIS6bZcgDe_Z2xZkhNEDwdxwbL8bo6V9z8,2023
163
- prefect/settings/base.py,sha256=W50z9U9t29Zp_p_SCEypCQSqJR9cLdH0zEnLKMFg-rY,7441
163
+ prefect/settings/base.py,sha256=dB793Q53wD-qUO1yQfxad7xtluWM50XQPhcsMkj6pl8,8410
164
164
  prefect/settings/constants.py,sha256=P9wjosqu5K9SERrpTFf9o8Y2O5g091F6goB4vLwz-FA,271
165
165
  prefect/settings/context.py,sha256=yKxnaDJHX8e2jmAVtw1RF9o7X4V3AOcz61sVeQyPX2c,2195
166
166
  prefect/settings/legacy.py,sha256=GcaB1mkahc4HbjnUvr4_3qNNxleke08dYnOXCUt8w3k,5617
167
167
  prefect/settings/profiles.py,sha256=VZdzOV-KSuAkCxtdhBmSG9i84-K2QLSx6g2-vIUkfig,12169
168
168
  prefect/settings/profiles.toml,sha256=kTvqDNMzjH3fsm5OEI-NKY4dMmipor5EvQXRB6rPEjY,522
169
- prefect/settings/sources.py,sha256=ixt4dTP766s2nr_IjPKS81ZneAaiWzw93zjrWCnkKp8,9345
169
+ prefect/settings/sources.py,sha256=5rO65PhQ4U6QmlA5q8ElL5ld0VNxHiR5eJUbXh0CDMg,12249
170
170
  prefect/settings/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  prefect/settings/models/api.py,sha256=DuoBHYeMX9MlgjT6JNLWPHSj_iySo98a0uNuTVSk1r8,1511
172
172
  prefect/settings/models/cli.py,sha256=mHB-BHBVO9qfQcr9uHbBmU6MMDLlLUUDxjyaRz7v1ls,958
@@ -224,20 +224,20 @@ prefect/utilities/slugify.py,sha256=57Vb14t13F3zm1P65KAu8nVeAz0iJCd1Qc5eMG-R5y8,
224
224
  prefect/utilities/templating.py,sha256=nAiOGMMHGbIDFkGYy-g-dzcbY311WfycdgAhsM3cLpY,13298
225
225
  prefect/utilities/text.py,sha256=JRs6WNUn07i5oRP_jyTUYD6I0hdVwyMI0JmJc8f9gFw,731
226
226
  prefect/utilities/timeout.py,sha256=BRDIOWnqcw3B7X9tIk83Y3n9nQrJzZgduDQ63z-ns8w,1286
227
- prefect/utilities/urls.py,sha256=tKB7Bmbhbe3lBpiAIp7Idb_TWDmmDZI6nNTnDkwDKKI,8207
227
+ prefect/utilities/urls.py,sha256=Wj7Q2vSSc11lX6FC0Wd295uTHDArDEa3rHJ967JJfPs,8919
228
228
  prefect/utilities/visualization.py,sha256=Lum4IvLQ0nHsdLt6GGzS3Wwo-828u1rmOKc5mmWu994,6502
229
229
  prefect/utilities/schema_tools/__init__.py,sha256=KsFsTEHQqgp89TkDpjggkgBBywoHQPxbx-m6YQhiNEI,322
230
230
  prefect/utilities/schema_tools/hydration.py,sha256=k12qVCdLLrK-mNo1hPCdhxM5f_N14Nj0vJdtiWYWffk,8858
231
231
  prefect/utilities/schema_tools/validation.py,sha256=2GCjxwApTFwzey40ul9OkcAXrU3r-kWK__9ucMo0qbk,9744
232
232
  prefect/workers/__init__.py,sha256=8dP8SLZbWYyC_l9DRTQSE3dEbDgns5DZDhxkp_NfsbQ,35
233
- prefect/workers/base.py,sha256=ChdMddrKvpmk08m-UQXiP2R4xCIfsiej-0zD2jt9llc,47795
233
+ prefect/workers/base.py,sha256=bgFZWymeu4RMUDH97R7tMPmrJSoLKVPZCoGAPkjHfVk,48898
234
234
  prefect/workers/block.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
235
235
  prefect/workers/cloud.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
236
236
  prefect/workers/process.py,sha256=tcJ3fbiraLCfpVGpv8dOHwMSfVzeD_kyguUOvPuIz6I,19796
237
237
  prefect/workers/server.py,sha256=lgh2FfSuaNU7b6HPxSFm8JtKvAvHsZGkiOo4y4tW1Cw,2022
238
238
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
239
- prefect_client-3.1.1.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
240
- prefect_client-3.1.1.dist-info/METADATA,sha256=OlGsslMyT1YoImmLFDnko6XXPcvfqJV__WBbd6KClG4,7338
241
- prefect_client-3.1.1.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
242
- prefect_client-3.1.1.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
243
- prefect_client-3.1.1.dist-info/RECORD,,
239
+ prefect_client-3.1.2.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
240
+ prefect_client-3.1.2.dist-info/METADATA,sha256=zs_vo1177_sGYQJnaNXeYU34A0hvA6hHMWzOLIbJ7CE,7338
241
+ prefect_client-3.1.2.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
242
+ prefect_client-3.1.2.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
243
+ prefect_client-3.1.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.44.0)
2
+ Generator: bdist_wheel (0.45.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5