prefect-client 3.0.0rc16__py3-none-any.whl → 3.0.0rc17__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/blocks/core.py CHANGED
@@ -1046,7 +1046,7 @@ class Block(BaseModel, ABC):
1046
1046
  @classmethod
1047
1047
  @sync_compatible
1048
1048
  @inject_client
1049
- async def register_type_and_schema(cls, client: "PrefectClient" = None):
1049
+ async def register_type_and_schema(cls, client: Optional["PrefectClient"] = None):
1050
1050
  """
1051
1051
  Makes block available for configuration with current Prefect API.
1052
1052
  Recursively registers all nested blocks. Registration is idempotent.
prefect/cache_policies.py CHANGED
@@ -143,8 +143,8 @@ class TaskSource(CachePolicy):
143
143
  def compute_key(
144
144
  self,
145
145
  task_ctx: TaskRunContext,
146
- inputs: Dict[str, Any],
147
- flow_parameters: Dict[str, Any],
146
+ inputs: Optional[Dict[str, Any]],
147
+ flow_parameters: Optional[Dict[str, Any]],
148
148
  **kwargs,
149
149
  ) -> Optional[str]:
150
150
  if not task_ctx:
@@ -153,6 +153,11 @@ class TaskSource(CachePolicy):
153
153
  lines = inspect.getsource(task_ctx.task)
154
154
  except TypeError:
155
155
  lines = inspect.getsource(task_ctx.task.fn.__class__)
156
+ except OSError as exc:
157
+ if "could not get source code" in str(exc):
158
+ lines = task_ctx.task.fn.__code__.co_code
159
+ else:
160
+ raise
156
161
 
157
162
  return hash_objects(lines)
158
163
 
prefect/flows.py CHANGED
@@ -611,12 +611,17 @@ class Flow(Generic[P, R]):
611
611
  # do not serialize the bound self object
612
612
  if self.ismethod and value is self.fn.__prefect_self__:
613
613
  continue
614
+ if isinstance(value, (PrefectFuture, State)):
615
+ # Don't call jsonable_encoder() on a PrefectFuture or State to
616
+ # avoid triggering a __getitem__ call
617
+ serialized_parameters[key] = f"<{type(value).__name__}>"
618
+ continue
614
619
  try:
615
620
  serialized_parameters[key] = jsonable_encoder(value)
616
621
  except (TypeError, ValueError):
617
622
  logger.debug(
618
- f"Parameter {key!r} for flow {self.name!r} is of unserializable "
619
- f"type {type(value).__name__!r} and will not be stored "
623
+ f"Parameter {key!r} for flow {self.name!r} is unserializable. "
624
+ f"Type {type(value).__name__!r} and will not be stored "
620
625
  "in the backend."
621
626
  )
622
627
  serialized_parameters[key] = f"<{type(value).__name__}>"
prefect/task_engine.py CHANGED
@@ -211,6 +211,9 @@ class BaseTaskRunEngine(Generic[P, R]):
211
211
  return task_run.state.is_running() or task_run.state.is_scheduled()
212
212
 
213
213
  def log_finished_message(self):
214
+ if not self.task_run:
215
+ return
216
+
214
217
  # If debugging, use the more complete `repr` than the usual `str` description
215
218
  display_state = repr(self.state) if PREFECT_DEBUG_MODE else str(self.state)
216
219
  level = logging.INFO if self.state.is_completed() else logging.ERROR
@@ -363,7 +366,7 @@ class SyncTaskRunEngine(BaseTaskRunEngine[P, R]):
363
366
  self.task_run.run_count += 1
364
367
 
365
368
  flow_run_context = FlowRunContext.get()
366
- if flow_run_context:
369
+ if flow_run_context and flow_run_context.flow_run:
367
370
  # Carry forward any task run information from the flow run
368
371
  flow_run = flow_run_context.flow_run
369
372
  self.task_run.flow_run_run_count = flow_run.run_count
@@ -622,21 +625,24 @@ class SyncTaskRunEngine(BaseTaskRunEngine[P, R]):
622
625
 
623
626
  self.logger = task_run_logger(task_run=self.task_run, task=self.task) # type: ignore
624
627
 
625
- if not PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
626
- # update the task run name if necessary
627
- if not self._task_name_set and self.task.task_run_name:
628
- task_run_name = _resolve_custom_task_run_name(
629
- task=self.task, parameters=self.parameters
630
- )
628
+ # update the task run name if necessary
629
+ if not self._task_name_set and self.task.task_run_name:
630
+ task_run_name = _resolve_custom_task_run_name(
631
+ task=self.task, parameters=self.parameters
632
+ )
633
+
634
+ if not PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
635
+ # update the task run name if necessary
631
636
  self.client.set_task_run_name(
632
637
  task_run_id=self.task_run.id, name=task_run_name
633
638
  )
634
- self.logger.extra["task_run_name"] = task_run_name
635
- self.logger.debug(
636
- f"Renamed task run {self.task_run.name!r} to {task_run_name!r}"
637
- )
638
- self.task_run.name = task_run_name
639
- self._task_name_set = True
639
+
640
+ self.logger.extra["task_run_name"] = task_run_name
641
+ self.logger.debug(
642
+ f"Renamed task run {self.task_run.name!r} to {task_run_name!r}"
643
+ )
644
+ self.task_run.name = task_run_name
645
+ self._task_name_set = True
640
646
  yield
641
647
 
642
648
  @contextmanager
@@ -655,21 +661,6 @@ class SyncTaskRunEngine(BaseTaskRunEngine[P, R]):
655
661
  self._is_started = True
656
662
  try:
657
663
  if PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
658
- from prefect.utilities.engine import (
659
- _resolve_custom_task_run_name,
660
- )
661
-
662
- task_run_name = (
663
- _resolve_custom_task_run_name(
664
- task=self.task, parameters=self.parameters
665
- )
666
- if self.task.task_run_name
667
- else None
668
- )
669
-
670
- if self.task_run and task_run_name:
671
- self.task_run.name = task_run_name
672
-
673
664
  if not self.task_run:
674
665
  self.task_run = run_coro_as_sync(
675
666
  self.task.create_local_run(
@@ -679,7 +670,6 @@ class SyncTaskRunEngine(BaseTaskRunEngine[P, R]):
679
670
  parent_task_run_context=TaskRunContext.get(),
680
671
  wait_for=self.wait_for,
681
672
  extra_task_inputs=dependencies,
682
- task_run_name=task_run_name,
683
673
  )
684
674
  )
685
675
  # Emit an event to capture that the task run was in the `PENDING` state.
@@ -1185,21 +1175,21 @@ class AsyncTaskRunEngine(BaseTaskRunEngine[P, R]):
1185
1175
 
1186
1176
  self.logger = task_run_logger(task_run=self.task_run, task=self.task) # type: ignore
1187
1177
 
1188
- if not PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
1189
- # update the task run name if necessary
1190
- if not self._task_name_set and self.task.task_run_name:
1191
- task_run_name = _resolve_custom_task_run_name(
1192
- task=self.task, parameters=self.parameters
1193
- )
1178
+ if not self._task_name_set and self.task.task_run_name:
1179
+ task_run_name = _resolve_custom_task_run_name(
1180
+ task=self.task, parameters=self.parameters
1181
+ )
1182
+ if not PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
1183
+ # update the task run name if necessary
1194
1184
  await self.client.set_task_run_name(
1195
1185
  task_run_id=self.task_run.id, name=task_run_name
1196
1186
  )
1197
- self.logger.extra["task_run_name"] = task_run_name
1198
- self.logger.debug(
1199
- f"Renamed task run {self.task_run.name!r} to {task_run_name!r}"
1200
- )
1201
- self.task_run.name = task_run_name
1202
- self._task_name_set = True
1187
+ self.logger.extra["task_run_name"] = task_run_name
1188
+ self.logger.debug(
1189
+ f"Renamed task run {self.task_run.name!r} to {task_run_name!r}"
1190
+ )
1191
+ self.task_run.name = task_run_name
1192
+ self._task_name_set = True
1203
1193
  yield
1204
1194
 
1205
1195
  @asynccontextmanager
@@ -1218,21 +1208,6 @@ class AsyncTaskRunEngine(BaseTaskRunEngine[P, R]):
1218
1208
  self._is_started = True
1219
1209
  try:
1220
1210
  if PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
1221
- from prefect.utilities.engine import (
1222
- _resolve_custom_task_run_name,
1223
- )
1224
-
1225
- task_run_name = (
1226
- _resolve_custom_task_run_name(
1227
- task=self.task, parameters=self.parameters
1228
- )
1229
- if self.task.task_run_name
1230
- else None
1231
- )
1232
-
1233
- if self.task_run and task_run_name:
1234
- self.task_run.name = task_run_name
1235
-
1236
1211
  if not self.task_run:
1237
1212
  self.task_run = await self.task.create_local_run(
1238
1213
  id=task_run_id,
@@ -1241,7 +1216,6 @@ class AsyncTaskRunEngine(BaseTaskRunEngine[P, R]):
1241
1216
  parent_task_run_context=TaskRunContext.get(),
1242
1217
  wait_for=self.wait_for,
1243
1218
  extra_task_inputs=dependencies,
1244
- task_run_name=task_run_name,
1245
1219
  )
1246
1220
  # Emit an event to capture that the task run was in the `PENDING` state.
1247
1221
  self._last_event = emit_task_run_state_change_event(
prefect/tasks.py CHANGED
@@ -814,7 +814,6 @@ class Task(Generic[P, R]):
814
814
  wait_for: Optional[Iterable[PrefectFuture]] = None,
815
815
  extra_task_inputs: Optional[Dict[str, Set[TaskRunInput]]] = None,
816
816
  deferred: bool = False,
817
- task_run_name: Optional[str] = None,
818
817
  ) -> TaskRun:
819
818
  if not PREFECT_EXPERIMENTAL_ENABLE_CLIENT_SIDE_TASK_ORCHESTRATION:
820
819
  raise RuntimeError(
@@ -839,12 +838,12 @@ class Task(Generic[P, R]):
839
838
  async with client:
840
839
  if not flow_run_context:
841
840
  dynamic_key = f"{self.task_key}-{str(uuid4().hex)}"
842
- task_run_name = task_run_name or self.name
841
+ task_run_name = self.name
843
842
  else:
844
843
  dynamic_key = _dynamic_key_for_task_run(
845
844
  context=flow_run_context, task=self
846
845
  )
847
- task_run_name = task_run_name or f"{self.name}-{dynamic_key}"
846
+ task_run_name = f"{self.name}-{dynamic_key}"
848
847
 
849
848
  if deferred:
850
849
  state = Scheduled()
prefect/transactions.py CHANGED
@@ -1,3 +1,4 @@
1
+ import copy
1
2
  import logging
2
3
  from contextlib import contextmanager
3
4
  from contextvars import ContextVar, Token
@@ -25,6 +26,7 @@ from prefect.results import (
25
26
  ResultFactory,
26
27
  get_default_result_storage,
27
28
  )
29
+ from prefect.utilities.annotations import NotSet
28
30
  from prefect.utilities.asyncutils import run_coro_as_sync
29
31
  from prefect.utilities.collections import AutoEnum
30
32
  from prefect.utilities.engine import _get_hook_name
@@ -72,8 +74,10 @@ class Transaction(ContextModel):
72
74
  def set(self, name: str, value: Any) -> None:
73
75
  self._stored_values[name] = value
74
76
 
75
- def get(self, name: str) -> Any:
77
+ def get(self, name: str, default: Any = NotSet) -> Any:
76
78
  if name not in self._stored_values:
79
+ if default is not NotSet:
80
+ return default
77
81
  raise ValueError(f"Could not retrieve value for unknown key: {name}")
78
82
  return self._stored_values.get(name)
79
83
 
@@ -104,6 +108,7 @@ class Transaction(ContextModel):
104
108
  # either inherit from parent or set a default of eager
105
109
  if parent:
106
110
  self.commit_mode = parent.commit_mode
111
+ self._stored_values = copy.deepcopy(parent._stored_values)
107
112
  else:
108
113
  self.commit_mode = CommitMode.LAZY
109
114
 
prefect/workers/base.py CHANGED
@@ -930,7 +930,12 @@ class BaseWorker(abc.ABC):
930
930
 
931
931
  deployment_vars = deployment.job_variables or {}
932
932
  flow_run_vars = flow_run.job_variables or {}
933
- job_variables = {**deployment_vars, **flow_run_vars}
933
+ job_variables = {**deployment_vars}
934
+
935
+ # merge environment variables carefully, otherwise full override
936
+ if isinstance(job_variables.get("env"), dict):
937
+ job_variables["env"].update(flow_run_vars.pop("env", {}))
938
+ job_variables.update(flow_run_vars)
934
939
 
935
940
  configuration = await self.job_configuration.from_template_and_values(
936
941
  base_job_template=self._work_pool.base_job_template,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: prefect-client
3
- Version: 3.0.0rc16
3
+ Version: 3.0.0rc17
4
4
  Summary: Workflow orchestration and management.
5
5
  Home-page: https://www.prefect.io
6
6
  Author: Prefect Technologies, Inc.
@@ -4,14 +4,14 @@ prefect/_version.py,sha256=I9JsXwt7BjAAbMEZgtmE3a6dJ2jqV-wqWto9D6msb3k,24597
4
4
  prefect/agent.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
5
5
  prefect/artifacts.py,sha256=wet3coxBtqK0914uTf-slYpXRVP0mjbZn804hXB-RS4,13011
6
6
  prefect/automations.py,sha256=NlQ62GPJzy-gnWQqX7c6CQJKw7p60WLGDAFcy82vtg4,5613
7
- prefect/cache_policies.py,sha256=uEKNGO-PJ3N35B2tjhRDtQULN6ok72D9raIoJaUyXk0,6365
7
+ prefect/cache_policies.py,sha256=779dI23HIPmrtImx9X6eVEH5jc9M7wE9T2isivNo8uM,6570
8
8
  prefect/context.py,sha256=Q04o0F1zc9O9y7H0Y6po1hvyajrviYAzuQmpKdNvgbM,21859
9
9
  prefect/engine.py,sha256=BpmDbe6miZcTl1vRkxfCPYcWSXADLigGPCagFwucMz0,1976
10
10
  prefect/exceptions.py,sha256=3s69Z_IC3HKF6BKxcHrMPXkKdYwfbEfaTjy4-5LOtQ0,11132
11
11
  prefect/filesystems.py,sha256=rbFvlqHXeeo71nK1Y5I0-ucmGOYUcdkbb6N2vpsRcWE,17229
12
12
  prefect/flow_engine.py,sha256=c8mIffc57zLtHFRo4sVtQOXGihVA_y2mZiXYzjJlOHY,29445
13
13
  prefect/flow_runs.py,sha256=EaXRIQTOnwnA0fO7_EjwafFRmS57K_CRy0Xsz3JDIhc,16070
14
- prefect/flows.py,sha256=Sl3m8Q3mXwY1MSgJSeViiXag4jtUBN7stMP1Fs4iepo,88039
14
+ prefect/flows.py,sha256=9TQZaDYSY3Ao72YHF5pvmEjXD8Z5vgTp2aLEAEWiJ2Y,88326
15
15
  prefect/futures.py,sha256=Zt5U7PnNpKUQuyfAhWAZZxpG0hQ6HXuA4KVg6E9sQf8,16208
16
16
  prefect/main.py,sha256=bab5nBn37a6gmxdPbTlRS2a9Cf0KY0GaCotDOSbcQ7M,1930
17
17
  prefect/manifests.py,sha256=477XcmfdC_yE81wT6zIAKnEUEJ0lH9ZLfOVSgX2FohE,676
@@ -22,12 +22,12 @@ prefect/results.py,sha256=3mVkVWZn_VSQ9Pik79StNy113rB_SEiP83SdoUsFvTM,24635
22
22
  prefect/serializers.py,sha256=Lo41EM0_qGzcfB_63390Izeo3DdK6cY6VZfxa9hpSGQ,8712
23
23
  prefect/settings.py,sha256=RpO6XMM2qf6KC_rQMHmQpcjul1t2rZmLOkK89Ta3OcM,72076
24
24
  prefect/states.py,sha256=lw22xucH46cN9stkxiV9ByIvq689mH5iL3gErri-Y18,22207
25
- prefect/task_engine.py,sha256=z5raK4OLgCRp6cubrTDL0XZQsx8Z5xTFwKn2QnITGcA,64053
25
+ prefect/task_engine.py,sha256=KIKspqIJpmT_8egEufaDThb1SvDGA9aPwPF5Y87UHe8,62799
26
26
  prefect/task_runners.py,sha256=W1n0yMwbDIqnvffFVJADo9MGEbLaYkzWk52rqgnkMY4,15019
27
27
  prefect/task_runs.py,sha256=jkaQOkRKOHS8fgHUijteriFpjMSKv4zldn1D8tZHkUI,8777
28
28
  prefect/task_worker.py,sha256=DX4NYERghB8RZeFleZE0xOq3yJVunjUaAKHtiz8wuRo,17992
29
- prefect/tasks.py,sha256=tpYQhH4wZcOeVTOOGus0Med4prLlmMM2jSf3TKuFdUQ,68230
30
- prefect/transactions.py,sha256=YyWuY99mBeEsY8JGR3_eyWbFIUxWIzbHfU2UMBKTaik,11038
29
+ prefect/tasks.py,sha256=cOJYhTkbPoqXZUAyWjztEOaAI1Q2dLGRqSQVN1zaYKI,68151
30
+ prefect/transactions.py,sha256=6j69ClTNr10XxrsVu9QmsRU6vYU-_14umk_fvAQsBNM,11266
31
31
  prefect/variables.py,sha256=-t5LVY0N-K4f0fa6YwruVVQqwnU3fGWBMYXXE32XPkA,4821
32
32
  prefect/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  prefect/_internal/_logging.py,sha256=HvNHY-8P469o5u4LYEDBTem69XZEt1QUeUaLToijpak,810
@@ -62,7 +62,7 @@ prefect/_internal/schemas/serializers.py,sha256=G_RGHfObjisUiRvd29p-zc6W4bwt5rE1
62
62
  prefect/_internal/schemas/validators.py,sha256=Y8bHb3EsLJTiHsffg_TPbknj0Nmln8vd6qySLFbfGzY,26546
63
63
  prefect/blocks/__init__.py,sha256=BUfh6gIwA6HEjRyVCAiv0he3M1zfM-oY-JrlBfeWeY8,182
64
64
  prefect/blocks/abstract.py,sha256=YLzCaf3yXv6wFCF5ZqCIHJNwH7fME1rLxC-SijARHzk,16319
65
- prefect/blocks/core.py,sha256=EAvmPga9fyUfK9QW_HFLSit0dn6Szh_KbDK3n8HX4q0,52155
65
+ prefect/blocks/core.py,sha256=b3cdh-MsEi2BfE8EZ2jLyzf1vPWMmHNp4AboC-vSthc,52165
66
66
  prefect/blocks/fields.py,sha256=1m507VVmkpOnMF_7N-qboRjtw4_ceIuDneX3jZ3Jm54,63
67
67
  prefect/blocks/notifications.py,sha256=_ARWqq0NHFPxaaW27W6VieBVBwAKELeHtAkHXXP3R_g,29076
68
68
  prefect/blocks/redis.py,sha256=GUKYyx2QLtyNvgf5FT_dJxbgQcOzWCja3I23J1-AXhM,5629
@@ -181,14 +181,14 @@ prefect/utilities/schema_tools/__init__.py,sha256=KsFsTEHQqgp89TkDpjggkgBBywoHQP
181
181
  prefect/utilities/schema_tools/hydration.py,sha256=Nitnmr35Mcn5z9NXIvh9DuZW5nCZxpjyMc9RFawMsgs,8376
182
182
  prefect/utilities/schema_tools/validation.py,sha256=2GCjxwApTFwzey40ul9OkcAXrU3r-kWK__9ucMo0qbk,9744
183
183
  prefect/workers/__init__.py,sha256=8dP8SLZbWYyC_l9DRTQSE3dEbDgns5DZDhxkp_NfsbQ,35
184
- prefect/workers/base.py,sha256=gjv-ZxwJOSr9mytY5bVwj8rtFriLGacGghQhwcX9hQI,43457
184
+ prefect/workers/base.py,sha256=T1G4EkiJlK7n1PZthmYseuzOr21pQypwZ2lQU1qElFA,43683
185
185
  prefect/workers/block.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
186
186
  prefect/workers/cloud.py,sha256=BOVVY5z-vUIQ2u8LwMTXDaNys2fjOZSS5YGDwJmTQjI,230
187
187
  prefect/workers/process.py,sha256=t1f1EYRoPL5B25KbLgUX2b5q-lCCAXb2Gpf6T2M9WfY,19822
188
188
  prefect/workers/server.py,sha256=lgh2FfSuaNU7b6HPxSFm8JtKvAvHsZGkiOo4y4tW1Cw,2022
189
189
  prefect/workers/utilities.py,sha256=VfPfAlGtTuDj0-Kb8WlMgAuOfgXCdrGAnKMapPSBrwc,2483
190
- prefect_client-3.0.0rc16.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
191
- prefect_client-3.0.0rc16.dist-info/METADATA,sha256=u1Slx4EdzeZnEU0qZ_7V28FsWgCbcfRsjYVCk-1KNcY,7404
192
- prefect_client-3.0.0rc16.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
193
- prefect_client-3.0.0rc16.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
194
- prefect_client-3.0.0rc16.dist-info/RECORD,,
190
+ prefect_client-3.0.0rc17.dist-info/LICENSE,sha256=MCxsn8osAkzfxKC4CC_dLcUkU8DZLkyihZ8mGs3Ah3Q,11357
191
+ prefect_client-3.0.0rc17.dist-info/METADATA,sha256=yn_q6Z_q8Sn99Gu_3AqFUuQmFaSB21H3AK7mbIadTRs,7404
192
+ prefect_client-3.0.0rc17.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
193
+ prefect_client-3.0.0rc17.dist-info/top_level.txt,sha256=MJZYJgFdbRc2woQCeB4vM6T33tr01TmkEhRcns6H_H4,8
194
+ prefect_client-3.0.0rc17.dist-info/RECORD,,