dagster 1.12.8__py3-none-any.whl → 1.12.9__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.
Files changed (37) hide show
  1. dagster/_cli/definitions.py +1 -1
  2. dagster/_core/asset_graph_view/asset_graph_view.py +8 -9
  3. dagster/_core/captured_log_api.py +6 -3
  4. dagster/_core/definitions/assets/graph/asset_graph_subset.py +5 -36
  5. dagster/_core/definitions/assets/graph/base_asset_graph.py +14 -2
  6. dagster/_core/definitions/assets/graph/remote_asset_graph.py +43 -0
  7. dagster/_core/definitions/auto_materialize_rule_impls.py +12 -7
  8. dagster/_core/definitions/job_definition.py +4 -0
  9. dagster/_core/definitions/metadata/metadata_set.py +4 -0
  10. dagster/_core/definitions/partitions/definition/partitions_definition.py +3 -0
  11. dagster/_core/definitions/partitions/definition/time_window.py +15 -0
  12. dagster/_core/definitions/reconstruct.py +1 -1
  13. dagster/_core/definitions/repository_definition/repository_definition.py +1 -1
  14. dagster/_core/execution/api.py +1 -1
  15. dagster/_core/execution/asset_backfill.py +33 -11
  16. dagster/_core/execution/context/op_execution_context.py +14 -0
  17. dagster/_core/executor/base.py +2 -2
  18. dagster/_core/executor/multiprocess.py +2 -2
  19. dagster/_core/executor/step_delegating/step_delegating_executor.py +9 -13
  20. dagster/_core/instance/instance.py +1 -1
  21. dagster/_core/instance/runs/run_domain.py +10 -0
  22. dagster/_core/selector/subset_selector.py +3 -3
  23. dagster/_core/snap/node.py +22 -10
  24. dagster/_core/storage/alembic/versions/29b539ebc72a_use_longtext_on_bulk_actions_body_in_.py +46 -0
  25. dagster/_core/storage/alembic/versions/f495c27d5019_use_longtext_on_asset_keys_cached_.py +46 -0
  26. dagster/_core/storage/event_log/schema.py +1 -1
  27. dagster/_core/storage/runs/schema.py +1 -1
  28. dagster/_core/storage/tags.py +2 -0
  29. dagster/_core/storage/upath_io_manager.py +1 -1
  30. dagster/_generate/download.py +2 -0
  31. dagster/version.py +1 -1
  32. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/METADATA +5 -4
  33. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/RECORD +37 -35
  34. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/WHEEL +0 -0
  35. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/entry_points.txt +0 -0
  36. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/licenses/LICENSE +0 -0
  37. {dagster-1.12.8.dist-info → dagster-1.12.9.dist-info}/top_level.txt +0 -0
@@ -139,7 +139,7 @@ def definitions_validate_command_impl(
139
139
  logger.info(f"Validation successful for code location {code_location}.")
140
140
 
141
141
  try:
142
- workspace.asset_graph.validate_partition_mappings()
142
+ workspace.asset_graph.validate_partitions()
143
143
  except Exception:
144
144
  logger.error(
145
145
  f"Asset graph contained an invalid partition mapping:\n{serializable_error_info_from_exc_info(sys.exc_info()).to_string()}"
@@ -238,9 +238,12 @@ class AssetGraphView(LoadingContext):
238
238
  self.asset_graph.has(key), f"Asset graph does not contain {key.to_user_string()}"
239
239
  )
240
240
 
241
- serializable_subset = self._with_current_partitions_def(
242
- asset_graph_subset.get_asset_subset(key, self.asset_graph)
243
- )
241
+ serializable_subset = asset_graph_subset.get_asset_subset(key)
242
+
243
+ if not serializable_subset:
244
+ return self.get_empty_subset(key=key)
245
+
246
+ serializable_subset = self._with_current_partitions_def(serializable_subset)
244
247
 
245
248
  return EntitySubset(
246
249
  self, key=key, value=_ValidatedEntitySubsetValue(serializable_subset.value)
@@ -626,12 +629,8 @@ class AssetGraphView(LoadingContext):
626
629
  async def _compute_backfill_in_progress_asset_subset(
627
630
  self, key: AssetKey
628
631
  ) -> EntitySubset[AssetKey]:
629
- value = (
630
- self._queryer.get_active_backfill_in_progress_asset_graph_subset()
631
- .get_asset_subset(asset_key=key, asset_graph=self.asset_graph)
632
- .value
633
- )
634
- return EntitySubset(self, key=key, value=_ValidatedEntitySubsetValue(value))
632
+ asset_graph_subset = self._queryer.get_active_backfill_in_progress_asset_graph_subset()
633
+ return self.get_entity_subset_from_asset_graph_subset(asset_graph_subset, key)
635
634
 
636
635
  async def _compute_execution_failed_unpartitioned(self, key: AssetKey) -> bool:
637
636
  from dagster._core.event_api import AssetRecordsFilter
@@ -1,11 +1,12 @@
1
1
  import base64
2
2
  from collections.abc import Sequence
3
- from typing import NamedTuple
4
3
 
4
+ from dagster_shared.record import record
5
5
  from dagster_shared.seven import json
6
6
 
7
7
 
8
- class LogLineCursor(NamedTuple):
8
+ @record
9
+ class LogLineCursor:
9
10
  """Representation of a log line cursor, to keep track of the place in the logs.
10
11
  The captured logs are stored in multiple files in the same direcotry. The cursor keeps
11
12
  track of the file name and the number of lines read so far.
@@ -36,4 +37,6 @@ class LogLineCursor(NamedTuple):
36
37
  @staticmethod
37
38
  def parse(cursor_str: str) -> "LogLineCursor":
38
39
  raw = json.loads(base64.b64decode(cursor_str).decode("utf-8"))
39
- return LogLineCursor(raw["log_key"], raw["line"], raw["has_more_now"])
40
+ return LogLineCursor(
41
+ log_key=raw["log_key"], line=raw["line"], has_more_now=raw["has_more_now"]
42
+ )
@@ -67,9 +67,7 @@ class AssetGraphSubset(NamedTuple):
67
67
  def is_empty(self) -> bool:
68
68
  return len(self.asset_keys) == 0
69
69
 
70
- def _get_serializable_entity_subset(
71
- self, asset_key: AssetKey
72
- ) -> SerializableEntitySubset[AssetKey]:
70
+ def get_asset_subset(self, asset_key: AssetKey) -> Optional[SerializableEntitySubset[AssetKey]]:
73
71
  if asset_key in self.non_partitioned_asset_keys:
74
72
  return SerializableEntitySubset(key=asset_key, value=True)
75
73
  elif asset_key in self.partitions_subsets_by_asset_key:
@@ -77,39 +75,10 @@ class AssetGraphSubset(NamedTuple):
77
75
  key=asset_key, value=self.partitions_subsets_by_asset_key[asset_key]
78
76
  )
79
77
  else:
80
- check.failed(f"Asset {asset_key} must be part of the AssetGraphSubset")
78
+ return None
81
79
 
82
- def get_asset_subset(
83
- self, asset_key: AssetKey, asset_graph: BaseAssetGraph
84
- ) -> SerializableEntitySubset[AssetKey]:
85
- """Returns an AssetSubset representing the subset of a specific asset that this
86
- AssetGraphSubset contains.
87
- """
88
- if (
89
- asset_key in self.non_partitioned_asset_keys
90
- or asset_key in self.partitions_subsets_by_asset_key
91
- ):
92
- return self._get_serializable_entity_subset(asset_key)
93
- else:
94
- partitions_def = asset_graph.get(asset_key).partitions_def
95
- return SerializableEntitySubset(
96
- key=asset_key,
97
- value=partitions_def.empty_subset() if partitions_def else False,
98
- )
99
-
100
- def get_partitions_subset(
101
- self, asset_key: AssetKey, asset_graph: Optional[BaseAssetGraph] = None
102
- ) -> PartitionsSubset:
103
- if asset_graph:
104
- partitions_def = asset_graph.get(asset_key).partitions_def
105
- if partitions_def is None:
106
- check.failed("Can only call get_partitions_subset on a partitioned asset")
107
-
108
- return self.partitions_subsets_by_asset_key.get(
109
- asset_key, partitions_def.empty_subset()
110
- )
111
- else:
112
- return self.partitions_subsets_by_asset_key[asset_key]
80
+ def get_partitions_subset(self, asset_key: AssetKey) -> PartitionsSubset:
81
+ return self.partitions_subsets_by_asset_key[asset_key]
113
82
 
114
83
  def iterate_asset_partitions(self) -> Iterable[AssetKeyPartitionKey]:
115
84
  for (
@@ -127,7 +96,7 @@ class AssetGraphSubset(NamedTuple):
127
96
  AssetGraphSubset contains.
128
97
  """
129
98
  for asset_key in self.asset_keys:
130
- yield self._get_serializable_entity_subset(asset_key)
99
+ yield check.not_none(self.get_asset_subset(asset_key))
131
100
 
132
101
  def __contains__(self, asset: Union[AssetKey, AssetKeyPartitionKey]) -> bool: # pyright: ignore[reportIncompatibleMethodOverride]
133
102
  """If asset is an AssetKeyPartitionKey, check if the given AssetKeyPartitionKey is in the
@@ -638,11 +638,19 @@ class BaseAssetGraph(ABC, Generic[T_AssetNode]):
638
638
  and not self.has_materializable_parents(key)
639
639
  }
640
640
 
641
- def validate_partition_mappings(self):
641
+ def validate_partitions(self):
642
642
  for node in self.asset_nodes:
643
643
  if node.is_external:
644
644
  continue
645
645
 
646
+ if node.partitions_def:
647
+ try:
648
+ node.partitions_def.validate_partition_definition()
649
+ except Exception as e:
650
+ raise DagsterInvalidDefinitionError(
651
+ f"Invalid partition definition for {node.key.to_user_string()}"
652
+ ) from e
653
+
646
654
  parents = self.get_parents(node)
647
655
  for parent in parents:
648
656
  if parent.partitions_def is None or parent.is_external:
@@ -738,7 +746,11 @@ class BaseAssetGraph(ABC, Generic[T_AssetNode]):
738
746
 
739
747
  queued_subsets_by_asset_key: dict[AssetKey, Optional[PartitionsSubset]] = {
740
748
  initial_asset_key: (
741
- initial_subset.get_partitions_subset(initial_asset_key, self)
749
+ (
750
+ initial_subset.get_partitions_subset(initial_asset_key)
751
+ if initial_asset_key in initial_subset.partitions_subsets_by_asset_key
752
+ else check.not_none(self.get(initial_asset_key).partitions_def).empty_subset()
753
+ )
742
754
  if self.get(initial_asset_key).is_partitioned
743
755
  else None
744
756
  ),
@@ -514,6 +514,49 @@ class RemoteAssetGraph(BaseAssetGraph[TRemoteAssetNode], ABC, Generic[TRemoteAss
514
514
  def get_checks_for_asset(self, asset_key: AssetKey) -> Sequence[RemoteAssetCheckNode]:
515
515
  return self._asset_check_nodes_by_asset_key.get(asset_key, [])
516
516
 
517
+ @cached_property
518
+ def _asset_keys_by_normalized_table_name(self) -> Mapping[str, AbstractSet[AssetKey]]:
519
+ from dagster._core.definitions.metadata.metadata_set import TableMetadataSet
520
+
521
+ by_table_name = defaultdict(set)
522
+ for node in self.asset_nodes:
523
+ normalized_table_name = TableMetadataSet.extract(node.metadata).normalized_table_name
524
+ if normalized_table_name:
525
+ by_table_name[normalized_table_name.lower()].add(node.key)
526
+
527
+ return by_table_name
528
+
529
+ def get_assets_for_same_storage_address(
530
+ self, asset_key: AssetKey
531
+ ) -> AbstractSet[TRemoteAssetNode]:
532
+ """Returns all asset keys that have the same dagster/table_name metadata as the given asset key.
533
+
534
+ Comparison is case-insensitive, so 'DB.SCHEMA.TABLE' matches 'db.schema.table'.
535
+
536
+ Args:
537
+ asset_key: The asset key to find matching table assets for.
538
+
539
+ Returns:
540
+ A set of asset nodes (excluding the node for the input key) that share the same
541
+ table_name metadata.
542
+ Returns an empty set if the asset has no table_name metadata.
543
+ """
544
+ if not self.has(asset_key):
545
+ return set()
546
+
547
+ from dagster._core.definitions.metadata.metadata_set import TableMetadataSet
548
+
549
+ input_node = self.get(asset_key)
550
+ input_table_name = TableMetadataSet.extract(input_node.metadata).normalized_table_name
551
+
552
+ if not input_table_name:
553
+ return set()
554
+
555
+ return {
556
+ self.get(key)
557
+ for key in self._asset_keys_by_normalized_table_name[input_table_name] - {asset_key}
558
+ }
559
+
517
560
  def get_check_keys_for_assets(
518
561
  self, asset_keys: AbstractSet[AssetKey]
519
562
  ) -> AbstractSet[AssetCheckKey]:
@@ -1056,14 +1056,19 @@ class SkipOnBackfillInProgressRule(
1056
1056
  AutomationResult,
1057
1057
  )
1058
1058
 
1059
+ # this backfilling subset is aware of the current partitions definitions, and so will
1060
+ # be valid
1061
+ asset_subset = (
1062
+ context.legacy_context.instance_queryer.get_active_backfill_target_asset_graph_subset().get_asset_subset(
1063
+ context.legacy_context.asset_key
1064
+ )
1065
+ or context.asset_graph_view.get_empty_subset(
1066
+ key=context.legacy_context.asset_key
1067
+ ).convert_to_serializable_subset()
1068
+ )
1069
+
1059
1070
  backfilling_subset = ValidAssetSubset.coerce_from_subset(
1060
- # this backfilling subset is aware of the current partitions definitions, and so will
1061
- # be valid
1062
- (
1063
- context.legacy_context.instance_queryer.get_active_backfill_target_asset_graph_subset()
1064
- ).get_asset_subset(
1065
- context.legacy_context.asset_key, context.legacy_context.asset_graph
1066
- ),
1071
+ asset_subset,
1067
1072
  context.legacy_context.partitions_def,
1068
1073
  )
1069
1074
 
@@ -828,6 +828,10 @@ class JobDefinition(IHasInternalInit):
828
828
  asset_selection=frozenset(asset_selection) if asset_selection else None,
829
829
  )
830
830
 
831
+ @property
832
+ def is_asset_job(self) -> bool:
833
+ return bool(self.asset_layer and self.asset_layer.selected_asset_keys)
834
+
831
835
  def _get_partitions_def(
832
836
  self, selected_asset_keys: Optional[Iterable[AssetKey]]
833
837
  ) -> PartitionsDefinition:
@@ -197,6 +197,10 @@ class TableMetadataSet(NamespacedMetadataSet):
197
197
  def current_key_by_legacy_key(cls) -> Mapping[str, str]:
198
198
  return {"relation_identifier": "table_name"}
199
199
 
200
+ @property
201
+ def normalized_table_name(self) -> Optional[str]:
202
+ return self.table_name.lower() if self.table_name else None
203
+
200
204
 
201
205
  class UriMetadataSet(NamespacedMetadataSet):
202
206
  """Metadata entry which supplies a URI address for an asset.
@@ -39,6 +39,9 @@ class PartitionsDefinition(ABC, Generic[T_str]):
39
39
 
40
40
  return DefaultPartitionsSubset
41
41
 
42
+ def validate_partition_definition(self) -> None:
43
+ pass
44
+
42
45
  @abstractmethod
43
46
  @public
44
47
  def get_partition_keys(
@@ -196,6 +196,21 @@ class TimeWindowPartitionsDefinition(PartitionsDefinition, IHaveNew):
196
196
  exclusions=cleaned_exclusions if cleaned_exclusions else None,
197
197
  )
198
198
 
199
+ def validate_partition_definition(self) -> None:
200
+ # Try to determine if there are multiple time ranges being mapped
201
+ # to the same partition key.
202
+ first_partition_key = self.get_first_partition_key()
203
+
204
+ if first_partition_key is None:
205
+ return
206
+
207
+ if self.get_next_partition_key(first_partition_key) == first_partition_key:
208
+ raise DagsterInvalidDefinitionError(
209
+ "This partition set contains multiple time ranges that map to the same partition key. "
210
+ f"This usually indicates that the partition set's format string ({self.fmt}) is "
211
+ f"not granular enough to produce a unique key for each time in the cron schedule ({self.cron_schedule})."
212
+ )
213
+
199
214
  @property
200
215
  def start_timestamp(self) -> float:
201
216
  return self.start_ts.timestamp
@@ -392,7 +392,7 @@ def reconstructable(target: Callable[..., "JobDefinition"]) -> ReconstructableJo
392
392
  "``GraphDefinition.to_job``, you must wrap the ``to_job`` call in a function at "
393
393
  "module scope, ie not within any other functions. "
394
394
  "To learn more, check out the docs on ``reconstructable``: "
395
- "https://docs.dagster.io/api/python-api/execution#dagster.reconstructable"
395
+ "https://docs.dagster.io/api/dagster/execution#dagster.reconstructable"
396
396
  )
397
397
  raise DagsterInvariantViolationError(
398
398
  "Reconstructable target should be a function or definition produced "
@@ -196,7 +196,7 @@ class RepositoryDefinition:
196
196
 
197
197
  def validate_loadable(self):
198
198
  self.load_all_definitions()
199
- self.asset_graph.validate_partition_mappings()
199
+ self.asset_graph.validate_partitions()
200
200
 
201
201
  @public
202
202
  @property
@@ -190,7 +190,7 @@ def execute_run(
190
190
  "execute_run requires a reconstructable job but received job definition directly"
191
191
  " instead. To support hand-off to other processes please wrap your definition in a call"
192
192
  " to reconstructable(). Learn more about reconstructable here:"
193
- " https://docs.dagster.io/api/python-api/execution#dagster.reconstructable"
193
+ " https://docs.dagster.io/api/dagster/execution#dagster.reconstructable"
194
194
  )
195
195
 
196
196
  check.inst_param(job, "job", IJob)
@@ -331,12 +331,18 @@ class AssetBackfillData(NamedTuple):
331
331
 
332
332
  Orders keys in the same topological level alphabetically.
333
333
  """
334
- nodes: list[BaseAssetNode] = [asset_graph.get(key) for key in self.target_subset.asset_keys]
334
+ nodes: list[BaseAssetNode] = [
335
+ asset_graph.get(key) for key in self.target_subset.asset_keys if asset_graph.has(key)
336
+ ]
335
337
  return [
336
338
  item
337
339
  for items_by_level in toposort({node.key: node.parent_keys for node in nodes})
338
340
  for item in sorted(items_by_level)
339
341
  if item in self.target_subset.asset_keys
342
+ ] + [
343
+ asset_key
344
+ for asset_key in self.target_subset.asset_keys
345
+ if not asset_graph.has(asset_key)
340
346
  ]
341
347
 
342
348
  def get_backfill_status_per_asset_key(
@@ -350,15 +356,23 @@ class AssetBackfillData(NamedTuple):
350
356
  def _get_status_for_asset_key(
351
357
  asset_key: AssetKey,
352
358
  ) -> Union[PartitionedAssetBackfillStatus, UnpartitionedAssetBackfillStatus]:
353
- if asset_graph.get(asset_key).is_partitioned:
354
- materialized_subset = self.materialized_subset.get_partitions_subset(
355
- asset_key, asset_graph
359
+ target_subset = check.not_none(self.target_subset.get_asset_subset(asset_key))
360
+
361
+ if target_subset.is_partitioned:
362
+ materialized_subset = (
363
+ self.materialized_subset.get_partitions_subset(asset_key)
364
+ if asset_key in self.materialized_subset.asset_keys
365
+ else target_subset.subset_value.empty_subset()
356
366
  )
357
- failed_subset = self.failed_and_downstream_subset.get_partitions_subset(
358
- asset_key, asset_graph
367
+ failed_subset = (
368
+ self.failed_and_downstream_subset.get_partitions_subset(asset_key)
369
+ if asset_key in self.failed_and_downstream_subset.asset_keys
370
+ else target_subset.subset_value.empty_subset()
359
371
  )
360
- requested_subset = self.requested_subset.get_partitions_subset(
361
- asset_key, asset_graph
372
+ requested_subset = (
373
+ self.requested_subset.get_partitions_subset(asset_key)
374
+ if asset_key in self.requested_subset.asset_keys
375
+ else target_subset.subset_value.empty_subset()
362
376
  )
363
377
 
364
378
  # The failed subset includes partitions that failed and their downstream partitions.
@@ -371,7 +385,7 @@ class AssetBackfillData(NamedTuple):
371
385
 
372
386
  return PartitionedAssetBackfillStatus(
373
387
  asset_key,
374
- len(self.target_subset.get_partitions_subset(asset_key, asset_graph)),
388
+ len(self.target_subset.get_partitions_subset(asset_key)),
375
389
  {
376
390
  AssetBackfillStatus.MATERIALIZED: len(materialized_subset),
377
391
  AssetBackfillStatus.FAILED: len(failed_subset - materialized_subset),
@@ -1961,8 +1975,16 @@ def _get_cant_run_because_of_parent_reason(
1961
1975
  if parent_node.partitions_def != candidate_node.partitions_def:
1962
1976
  return f"parent {parent_node.key.to_user_string()} and {candidate_node.key.to_user_string()} have different partitions definitions so they cannot be materialized in the same run. {candidate_node.key.to_user_string()} can be materialized once {parent_node.key.to_user_string()} is materialized."
1963
1977
 
1964
- parent_target_subset = target_subset.get_asset_subset(parent_asset_key, asset_graph)
1965
- candidate_target_subset = target_subset.get_asset_subset(candidate_asset_key, asset_graph)
1978
+ parent_target_subset = (
1979
+ target_subset.get_asset_subset(parent_asset_key)
1980
+ or asset_graph_view.get_empty_subset(key=parent_asset_key).convert_to_serializable_subset()
1981
+ )
1982
+ candidate_target_subset = (
1983
+ target_subset.get_asset_subset(candidate_asset_key)
1984
+ or asset_graph_view.get_empty_subset(
1985
+ key=candidate_asset_key
1986
+ ).convert_to_serializable_subset()
1987
+ )
1966
1988
 
1967
1989
  num_parent_partitions_being_requested_this_tick = parent_being_requested_this_tick_subset.size
1968
1990
 
@@ -183,6 +183,20 @@ class OpExecutionContext(AbstractComputeExecutionContext):
183
183
  """str: The id of the current execution's run."""
184
184
  return self._step_execution_context.run_id
185
185
 
186
+ @public
187
+ @property
188
+ def location_name(self) -> Optional[str]:
189
+ """Optional[str]: The name of the code location for this run.
190
+
191
+ This is the name of the code location (repository location) from which
192
+ the job/pipeline was loaded. Returns None if the job was not loaded from
193
+ a remote code location (e.g., in tests or when running locally without
194
+ a code location).
195
+ """
196
+ if self.dagster_run and self.dagster_run.remote_job_origin:
197
+ return self.dagster_run.remote_job_origin.location_name
198
+ return None
199
+
186
200
  @public
187
201
  @property
188
202
  def run_config(self) -> Mapping[str, object]:
@@ -79,12 +79,12 @@ class Executor(ABC):
79
79
  else:
80
80
  return original_event
81
81
 
82
- def get_failure_or_retry_event_after_error(
82
+ def log_failure_or_retry_event_after_error(
83
83
  self,
84
84
  step_context: "IStepContext",
85
85
  err_info: SerializableErrorInfo,
86
86
  known_state: "KnownExecutionState",
87
- ):
87
+ ) -> "DagsterEvent":
88
88
  from dagster._core.events import DagsterEvent
89
89
 
90
90
  # determine the retry policy for the step if needed
@@ -285,7 +285,7 @@ class MultiprocessExecutor(Executor):
285
285
  )
286
286
 
287
287
  failure_or_retry_event = (
288
- self.get_failure_or_retry_event_after_error(
288
+ self.log_failure_or_retry_event_after_error(
289
289
  step_context,
290
290
  event_or_none.engine_event_data.error,
291
291
  active_execution.get_known_state(),
@@ -309,7 +309,7 @@ class MultiprocessExecutor(Executor):
309
309
  ),
310
310
  EngineEventData.engine_error(serializable_error),
311
311
  )
312
- failure_or_retry_event = self.get_failure_or_retry_event_after_error(
312
+ failure_or_retry_event = self.log_failure_or_retry_event_after_error(
313
313
  step_context, serializable_error, active_execution.get_known_state()
314
314
  )
315
315
 
@@ -13,7 +13,6 @@ from dagster._core.events import DagsterEvent, DagsterEventType, EngineEventData
13
13
  from dagster._core.execution.context.system import PlanOrchestrationContext
14
14
  from dagster._core.execution.plan.active import ActiveExecution
15
15
  from dagster._core.execution.plan.instance_concurrency_context import InstanceConcurrencyContext
16
- from dagster._core.execution.plan.objects import StepFailureData
17
16
  from dagster._core.execution.plan.plan import ExecutionPlan
18
17
  from dagster._core.execution.retries import RetryMode
19
18
  from dagster._core.execution.step_dependency_config import StepDependencyConfig
@@ -319,7 +318,7 @@ class StepDelegatingExecutor(Executor):
319
318
  assert isinstance(
320
319
  dagster_event.engine_event_data.error, SerializableErrorInfo
321
320
  )
322
- self.get_failure_or_retry_event_after_error(
321
+ self.log_failure_or_retry_event_after_error(
323
322
  step_context,
324
323
  dagster_event.engine_event_data.error,
325
324
  active_execution.get_known_state(),
@@ -363,23 +362,20 @@ class StepDelegatingExecutor(Executor):
363
362
  cls_name=None,
364
363
  )
365
364
 
366
- self.get_failure_or_retry_event_after_error(
365
+ self.log_failure_or_retry_event_after_error(
367
366
  step_context,
368
367
  health_check_error,
369
368
  active_execution.get_known_state(),
370
369
  )
371
370
 
372
371
  except Exception:
373
- serializable_error = serializable_error_info_from_exc_info(
374
- sys.exc_info()
375
- )
376
- # Log a step failure event if there was an error during the health
377
- # check
378
- DagsterEvent.step_failure_event(
379
- step_context=plan_context.for_step(step),
380
- step_failure_data=StepFailureData(
381
- error=serializable_error,
382
- user_failure_data=None,
372
+ DagsterEvent.engine_event(
373
+ step_context,
374
+ f"Error while checking health for step {step.key}",
375
+ EngineEventData(
376
+ error=serializable_error_info_from_exc_info(
377
+ sys.exc_info()
378
+ )
383
379
  ),
384
380
  )
385
381
 
@@ -89,7 +89,7 @@ class DagsterInstance(
89
89
  For example, to use Postgres for dagster storage, you can write a ``dagster.yaml`` such as the
90
90
  following:
91
91
 
92
- .. literalinclude:: ../../../../../../examples/docs_snippets/docs_snippets/deploying/dagster-pg.yaml
92
+ .. literalinclude:: ../../../../../examples/docs_snippets/docs_snippets/deploying/dagster-pg.yaml
93
93
  :caption: dagster.yaml
94
94
  :language: YAML
95
95
 
@@ -35,6 +35,7 @@ from dagster._core.storage.tags import (
35
35
  ASSET_RESUME_RETRY_TAG,
36
36
  BACKFILL_ID_TAG,
37
37
  BACKFILL_TAGS,
38
+ CODE_LOCATION_TAG,
38
39
  PARENT_RUN_ID_TAG,
39
40
  PARTITION_NAME_TAG,
40
41
  RESUME_RETRY_TAG,
@@ -222,6 +223,15 @@ class RunDomain:
222
223
  "must include a remote job origin when creating a run using a remote asset graph",
223
224
  )
224
225
 
226
+ # Add the code location tag to the validated tags
227
+ # This is useful for filtering runs by code location in the web server
228
+ # or control concurrency by code location with tag concurrency limits.
229
+ if remote_job_origin:
230
+ validated_tags = {
231
+ **validated_tags,
232
+ CODE_LOCATION_TAG: remote_job_origin.repository_origin.code_location_origin.location_name,
233
+ }
234
+
225
235
  dagster_run = self.construct_run_with_snapshots(
226
236
  job_name=job_name,
227
237
  run_id=run_id, # type: ignore # (possible none)
@@ -237,12 +237,12 @@ def fetch_sources(
237
237
  def has_upstream_within_selection(key: AssetKey) -> bool:
238
238
  if key not in dp:
239
239
  dp[key] = any(
240
- parent_node in within_selection or has_upstream_within_selection(parent_node)
241
- for parent_node in graph.get(key).parent_keys - {key}
240
+ parent_key in within_selection or has_upstream_within_selection(parent_key)
241
+ for parent_key in (graph.asset_dep_graph["upstream"][key] - {key})
242
242
  )
243
243
  return dp[key]
244
244
 
245
- return {node for node in within_selection if not has_upstream_within_selection(node)}
245
+ return {key for key in within_selection if not has_upstream_within_selection(key)}
246
246
 
247
247
 
248
248
  def fetch_connected_assets_definitions(
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Mapping, Sequence, Set
2
- from functools import cached_property
2
+ from functools import cached_property, partial
3
3
  from typing import Optional, Union
4
4
 
5
5
  import dagster._check as check
@@ -135,14 +135,21 @@ def build_input_def_snap(input_def: InputDefinition) -> InputDefSnap:
135
135
  )
136
136
 
137
137
 
138
- def build_output_def_snap(output_def: OutputDefinition) -> OutputDefSnap:
138
+ def build_output_def_snap(output_def: OutputDefinition, job_def: JobDefinition) -> OutputDefSnap:
139
139
  check.inst_param(output_def, "output_def", OutputDefinition)
140
+ check.inst_param(job_def, "job_def", JobDefinition)
141
+
142
+ # Don't include verbose user-defined metadata(description/metadata fields) on the output
143
+ # definition snapshots for asset jobs, since they can be quite verbose/large and they
144
+ # map directly to information that is already available on the asset graph
145
+ include_verbose_metadata = not job_def.is_asset_job
146
+
140
147
  return OutputDefSnap(
141
148
  name=output_def.name,
142
149
  dagster_type_key=output_def.dagster_type.key,
143
- description=output_def.description,
150
+ description=output_def.description if include_verbose_metadata else None,
144
151
  is_required=output_def.is_required,
145
- metadata=output_def.metadata,
152
+ metadata=output_def.metadata if include_verbose_metadata else {},
146
153
  is_dynamic=output_def.is_dynamic,
147
154
  )
148
155
 
@@ -223,9 +230,9 @@ def build_node_defs_snapshot(job_def: JobDefinition) -> NodeDefsSnapshot:
223
230
  graph_def_snaps = []
224
231
  for node_def in job_def.all_node_defs:
225
232
  if isinstance(node_def, OpDefinition):
226
- op_def_snaps.append(build_op_def_snap(node_def))
233
+ op_def_snaps.append(build_op_def_snap(node_def, job_def))
227
234
  elif isinstance(node_def, GraphDefinition):
228
- graph_def_snaps.append(build_graph_def_snap(node_def))
235
+ graph_def_snaps.append(build_graph_def_snap(node_def, job_def))
229
236
  else:
230
237
  check.failed(f"Unexpected NodeDefinition type {node_def}")
231
238
 
@@ -250,12 +257,15 @@ def _by_name(
250
257
  return snap.name
251
258
 
252
259
 
253
- def build_graph_def_snap(graph_def: GraphDefinition) -> GraphDefSnap:
260
+ def build_graph_def_snap(graph_def: GraphDefinition, job_def: JobDefinition) -> GraphDefSnap:
254
261
  check.inst_param(graph_def, "graph_def", GraphDefinition)
255
262
  return GraphDefSnap(
256
263
  name=graph_def.name,
257
264
  input_def_snaps=sorted(map(build_input_def_snap, graph_def.input_defs), key=_by_name),
258
- output_def_snaps=sorted(map(build_output_def_snap, graph_def.output_defs), key=_by_name),
265
+ output_def_snaps=sorted(
266
+ map(partial(build_output_def_snap, job_def=job_def), graph_def.output_defs),
267
+ key=_by_name,
268
+ ),
259
269
  description=graph_def.description,
260
270
  tags=graph_def.tags,
261
271
  config_field_snap=(
@@ -278,12 +288,14 @@ def build_graph_def_snap(graph_def: GraphDefinition) -> GraphDefSnap:
278
288
  )
279
289
 
280
290
 
281
- def build_op_def_snap(op_def: OpDefinition) -> OpDefSnap:
291
+ def build_op_def_snap(op_def: OpDefinition, job_def: JobDefinition) -> OpDefSnap:
282
292
  check.inst_param(op_def, "op_def", OpDefinition)
283
293
  return OpDefSnap(
284
294
  name=op_def.name,
285
295
  input_def_snaps=sorted(map(build_input_def_snap, op_def.input_defs), key=_by_name),
286
- output_def_snaps=sorted(map(build_output_def_snap, op_def.output_defs), key=_by_name),
296
+ output_def_snaps=sorted(
297
+ map(partial(build_output_def_snap, job_def=job_def), op_def.output_defs), key=_by_name
298
+ ),
287
299
  description=op_def.description,
288
300
  tags=op_def.tags,
289
301
  required_resource_keys=sorted(op_def.required_resource_keys),
@@ -0,0 +1,46 @@
1
+ """use longtext on bulk_actions.body in mysql
2
+
3
+ Revision ID: 29b539ebc72a
4
+ Revises: f495c27d5019
5
+ Create Date: 2026-01-06 07:02:58.437749
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy import inspect
12
+ from sqlalchemy.dialects.mysql import LONGTEXT
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "29b539ebc72a"
16
+ down_revision = "f495c27d5019"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade():
22
+ inspector = inspect(op.get_bind())
23
+ if "mysql" not in inspector.dialect.dialect_description:
24
+ return
25
+
26
+ op.alter_column(
27
+ table_name="bulk_actions",
28
+ column_name="body",
29
+ nullable=True,
30
+ type_=sa.types.Text().with_variant(LONGTEXT, "mysql"),
31
+ existing_type=sa.types.Text(),
32
+ )
33
+
34
+
35
+ def downgrade():
36
+ inspector = inspect(op.get_bind())
37
+ if "mysql" not in inspector.dialect.dialect_description:
38
+ return
39
+
40
+ op.alter_column(
41
+ table_name="bulk_actions",
42
+ column_name="body",
43
+ nullable=True,
44
+ type_=sa.types.Text(),
45
+ existing_type=sa.types.Text().with_variant(LONGTEXT, "mysql"),
46
+ )
@@ -0,0 +1,46 @@
1
+ """use longtext on asset_keys cached_status_data in mysql
2
+
3
+ Revision ID: f495c27d5019
4
+ Revises: 7e2f3204cf8e
5
+ Create Date: 2026-01-05 12:28:45.417971
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+ from sqlalchemy import inspect
12
+ from sqlalchemy.dialects.mysql import LONGTEXT
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "f495c27d5019"
16
+ down_revision = "7e2f3204cf8e"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ def upgrade():
22
+ inspector = inspect(op.get_bind())
23
+ if "mysql" not in inspector.dialect.dialect_description:
24
+ return
25
+
26
+ op.alter_column(
27
+ table_name="asset_keys",
28
+ column_name="cached_status_data",
29
+ nullable=True,
30
+ type_=sa.types.Text().with_variant(LONGTEXT, "mysql"),
31
+ existing_type=sa.types.Text(),
32
+ )
33
+
34
+
35
+ def downgrade():
36
+ inspector = inspect(op.get_bind())
37
+ if "mysql" not in inspector.dialect.dialect_description:
38
+ return
39
+
40
+ op.alter_column(
41
+ table_name="asset_keys",
42
+ column_name="cached_status_data",
43
+ nullable=True,
44
+ type_=sa.types.Text(),
45
+ existing_type=sa.types.Text().with_variant(LONGTEXT, "mysql"),
46
+ )
@@ -66,7 +66,7 @@ AssetKeyTable = db.Table(
66
66
  ), # guarded by secondary index check
67
67
  db.Column("tags", db.TEXT), # guarded by secondary index check
68
68
  db.Column("create_timestamp", db.DateTime, server_default=get_sql_current_timestamp()),
69
- db.Column("cached_status_data", db.TEXT),
69
+ db.Column("cached_status_data", MySQLCompatabilityTypes.LongText),
70
70
  )
71
71
 
72
72
  AssetEventTagsTable = db.Table(
@@ -118,7 +118,7 @@ BulkActionsTable = db.Table(
118
118
  db.Column("key", db.String(32), unique=True, nullable=False),
119
119
  db.Column("status", db.String(255), nullable=False),
120
120
  db.Column("timestamp", db.types.TIMESTAMP, nullable=False),
121
- db.Column("body", db.Text),
121
+ db.Column("body", MySQLCompatabilityTypes.LongText),
122
122
  db.Column("action_type", db.String(32)),
123
123
  db.Column("selector_id", db.Text),
124
124
  db.Column("job_name", db.Text, nullable=True),
@@ -7,6 +7,8 @@ KIND_PREFIX = f"{SYSTEM_TAG_PREFIX}kind/"
7
7
 
8
8
  REPOSITORY_LABEL_TAG = f"{HIDDEN_TAG_PREFIX}repository"
9
9
 
10
+ CODE_LOCATION_TAG = f"{SYSTEM_TAG_PREFIX}code_location"
11
+
10
12
  SCHEDULE_NAME_TAG = f"{SYSTEM_TAG_PREFIX}schedule_name"
11
13
 
12
14
  SENSOR_NAME_TAG = f"{SYSTEM_TAG_PREFIX}sensor_name"
@@ -383,7 +383,7 @@ class UPathIOManager(IOManager):
383
383
 
384
384
  return results_without_errors
385
385
 
386
- awaited_objects = asyncio.get_event_loop().run_until_complete(collect())
386
+ awaited_objects = asyncio.run(collect())
387
387
 
388
388
  return {
389
389
  partition_key: awaited_object
@@ -30,6 +30,7 @@ AVAILABLE_EXAMPLES = [
30
30
  "assets_pandas_pyspark",
31
31
  "assets_pandas_type_metadata",
32
32
  "assets_smoke_test",
33
+ "data-quality-patterns",
33
34
  "deploy_docker",
34
35
  "deploy_ecs",
35
36
  "deploy_k8s",
@@ -37,6 +38,7 @@ AVAILABLE_EXAMPLES = [
37
38
  "feature_graph_backed_assets",
38
39
  "google_drive_factory",
39
40
  "ingestion-patterns",
41
+ "project_databricks_and_snowflake",
40
42
  "oss-metadata-to-plus",
41
43
  "project_analytics",
42
44
  "project_fully_featured",
dagster/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.12.8"
1
+ __version__ = "1.12.9"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster
3
- Version: 1.12.8
3
+ Version: 1.12.9
4
4
  Summary: Dagster is an orchestration platform for the development, production, and observation of data assets.
5
5
  Author: Dagster Labs
6
6
  Author-email: hello@dagsterlabs.com
@@ -24,11 +24,12 @@ Classifier: Programming Language :: Python :: 3.10
24
24
  Classifier: Programming Language :: Python :: 3.11
25
25
  Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Programming Language :: Python :: 3.13
27
+ Classifier: Programming Language :: Python :: 3.14
27
28
  Classifier: License :: OSI Approved :: Apache Software License
28
29
  Classifier: Topic :: System :: Monitoring
29
30
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
30
31
  Classifier: Operating System :: OS Independent
31
- Requires-Python: >=3.10,<3.14
32
+ Requires-Python: >=3.10,<3.15
32
33
  Description-Content-Type: text/markdown
33
34
  License-File: LICENSE
34
35
  Requires-Dist: click<9.0,>=5.0
@@ -59,8 +60,8 @@ Requires-Dist: universal_pathlib; python_version < "3.12"
59
60
  Requires-Dist: universal_pathlib>=0.2.0; python_version >= "3.12"
60
61
  Requires-Dist: rich
61
62
  Requires-Dist: filelock
62
- Requires-Dist: dagster-pipes==1.12.8
63
- Requires-Dist: dagster-shared==1.12.8
63
+ Requires-Dist: dagster-pipes==1.12.9
64
+ Requires-Dist: dagster-shared==1.12.9
64
65
  Requires-Dist: antlr4-python3-runtime
65
66
  Provides-Extra: docker
66
67
  Requires-Dist: docker; extra == "docker"
@@ -4,7 +4,7 @@ dagster/_annotations.py,sha256=GC7Rc8ZJZS9EpUuiCMyrtLZ5lsGGjPPkVtlmaClkt2o,1610
4
4
  dagster/_builtins.py,sha256=J6A1CE28JV0itz73hCaHIKoUknb1j5B3QO5Frx_hQuU,471
5
5
  dagster/_module_alias_map.py,sha256=KsLPXRga52UbPcEjFpOie8tvb7sGdNnikl3MUelYtVA,3349
6
6
  dagster/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
7
- dagster/version.py,sha256=MukaistZHiQ_HvCd7oJvFM6KoAwAzuUNKkDHr_pCzwk,23
7
+ dagster/version.py,sha256=dn_QNndv8rTcyvhz-Pp7s8wSrUmgQrpTKP3NCyL5Wp0,23
8
8
  dagster/_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  dagster/_api/get_server_id.py,sha256=sBjhjcHgB__iIN567QCJmTtBK6-v31VfjDsYNZIohVw,731
10
10
  dagster/_api/list_repositories.py,sha256=fbjMobgFKzwoMN825GEgDeCx1jzUlW2vPhPDuYIg93g,3905
@@ -22,7 +22,7 @@ dagster/_cli/asset.py,sha256=Q8ktHz8j-9iJm9qnb6f4HOL0KTvGFH5X9J-KDIEGG-M,12751
22
22
  dagster/_cli/code_server.py,sha256=9__r3D8b9OnWAuG1-L_v6rCIkJDSPo-x0sLBH5c30hE,10399
23
23
  dagster/_cli/config_scaffolder.py,sha256=D3JYF_8u1mSgaYqrV_LHIDFoGrrP2UUNuJXZtegkGYk,2374
24
24
  dagster/_cli/debug.py,sha256=ub8kEXDpnysokKUY_khPLYjLV-AKc4Sr4J3xIfznxJA,3400
25
- dagster/_cli/definitions.py,sha256=VL-2cKtLGcpPZPHsF7mco7MZ-Ez47eJiBDMRCYyLblE,5403
25
+ dagster/_cli/definitions.py,sha256=0YR3-hbtg1cg36YK-xoYvJlEpGPZ-9G3E4885R-R_S4,5395
26
26
  dagster/_cli/dev.py,sha256=spRTstgbAUy8raECbSfKfSCwR3VUgNwJ1L9JzrKArKQ,12399
27
27
  dagster/_cli/instance.py,sha256=CSxsaPPRMT2TgGQw4abdLeO1kMX5oZ5lxqfdlYMrD7Q,6687
28
28
  dagster/_cli/job.py,sha256=bfhM2Nb5VO4ickm5tlWktjLQ9nOImY7HJ5a-Ec9ImRE,35600
@@ -59,7 +59,7 @@ dagster/_config/pythonic_config/type_check_utils.py,sha256=K75S_1CGFf5KFAoxDbChN
59
59
  dagster/_config/pythonic_config/typing_utils.py,sha256=iph3bfIu2-ANo3pfuQZKOB3xj9mv3TYGVoBFzlmNrqE,10056
60
60
  dagster/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
61
  dagster/_core/assets.py,sha256=WJl_wtNmZPD0yPPsIPTWvaVhUVt8sE_EAts3dmE2g-s,983
62
- dagster/_core/captured_log_api.py,sha256=mW8BvTnBwPOA9Dz9gLlV-5z8c9bUR8jGRe_4uzs8H2o,1656
62
+ dagster/_core/captured_log_api.py,sha256=CKXR2vfHoKQhJTXDKCTk7OqQjbwGlWb7F5BvXdSFclA,1711
63
63
  dagster/_core/code_pointer.py,sha256=LfgQ4IPenIK2DtyfvAH_qcOl36JYVg3rGtlaHNCPVmY,12424
64
64
  dagster/_core/debug.py,sha256=_hzIFHGR58jTkFY84Awcxdw9WnOUKvlM7F20-Pk3kkQ,2301
65
65
  dagster/_core/decorator_utils.py,sha256=X3c0O7XjBHho0ccbkKi7lVqS-zv2sAaBKOrlmcGZoZc,9724
@@ -79,7 +79,7 @@ dagster/_core/test_utils.py,sha256=xqnrQ5CLKSh5bmeLEXPCVoNoX0I3gyhy3VAnfvQ2PkE,2
79
79
  dagster/_core/utility_ops.py,sha256=KtVCu9FquKD4AfXBHrRTeWSuRrz1kHta9ABRMC7ubTU,1468
80
80
  dagster/_core/utils.py,sha256=0LtOF1ji14rhmlif1tARvsm7hokeioM5tavDBkCKTqc,8166
81
81
  dagster/_core/asset_graph_view/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
- dagster/_core/asset_graph_view/asset_graph_view.py,sha256=bOCHqibXSzulEnfynnWAdo5rLKuMw6sMqFYb72KAsQM,42026
82
+ dagster/_core/asset_graph_view/asset_graph_view.py,sha256=LlUQUvjNupyNdnAXgEiBgqrSWbw0B2gOy9JqEJ1EZMc,42021
83
83
  dagster/_core/asset_graph_view/bfs.py,sha256=x1HRAiT7fN87ZfL4hdlEBNHvScXwGxNa1i4dHzR9gvg,8157
84
84
  dagster/_core/asset_graph_view/entity_subset.py,sha256=VlvH2kR9Ov-eB4nOjyObd_Mq1WHb2YiG1St6bzlFBuc,5596
85
85
  dagster/_core/asset_graph_view/serializable_entity_subset.py,sha256=kV9InWpbXsEACGwBIqizHxSWlU6XwNWsaaIPnAvBhAs,7358
@@ -93,7 +93,7 @@ dagster/_core/definitions/asset_sensor_definition.py,sha256=SN3iWp2G5ASosZ6jLHoe
93
93
  dagster/_core/definitions/auto_materialize_policy.py,sha256=lezqPrjE8o8RbVIW8HrHEpXvIUTywOAIAZejxJ8OGjY,14363
94
94
  dagster/_core/definitions/auto_materialize_rule.py,sha256=evG-F_vuwrHnFx-eYFFXhEgLA35JCUZtauN_K0--6Gw,11763
95
95
  dagster/_core/definitions/auto_materialize_rule_evaluation.py,sha256=0INxDvF-skuAkqmtf-NTU0SCGrC6r0fmMOef_wD4XoA,5079
96
- dagster/_core/definitions/auto_materialize_rule_impls.py,sha256=b-Lk9OsgMhd2VpRrIYNDa-rZ85pI1u0y1b7hgUqog48,51872
96
+ dagster/_core/definitions/auto_materialize_rule_impls.py,sha256=ZpYf5LmlCFeTg6Ot3LFvsVvoH2AtYvonUZmXOgaik0Y,52015
97
97
  dagster/_core/definitions/automation_condition_sensor_definition.py,sha256=lBeOBZ0eLXxHi47rrcfhU4VaANxiVQ0wEk5Vb-oV3x8,11505
98
98
  dagster/_core/definitions/automation_tick_evaluation_context.py,sha256=5PpiUBNSnTy2IA6mNx6tPr-jXnkTqHEzdDduo3iczrw,22824
99
99
  dagster/_core/definitions/backfill_policy.py,sha256=Ii9HasVaXWv5HKAR7d4uIJfwPqUJQApqCSBNHJfkclw,3987
@@ -121,7 +121,7 @@ dagster/_core/definitions/inference.py,sha256=WhvPqo4_AewcFlyrI5sG6gz-XiW0D6bPqF
121
121
  dagster/_core/definitions/input.py,sha256=vwB-WtXZutQIePiA2vj-4mlsUiK4p-5guuY5_E0NmlI,21007
122
122
  dagster/_core/definitions/instigation_logger.py,sha256=n0l2a7uWo6qlDB__zzONRNW-U6bnCuZeHxsV_kuIbX8,7396
123
123
  dagster/_core/definitions/job_base.py,sha256=o5FBiqml5le14TAiDPxmYRLSoW4-_G0N2HzeXvakME8,4293
124
- dagster/_core/definitions/job_definition.py,sha256=27n29A9RJHjxlf0bqJwnrpXr4o6CW6UikKoNek0D-rY,62173
124
+ dagster/_core/definitions/job_definition.py,sha256=Hmon_NOwLvRCKSqPkaqr0AVjjhcQBOCRUqHma0ZPxNQ,62303
125
125
  dagster/_core/definitions/logger_definition.py,sha256=eBb-9xOOMRKJY43wv7rnQgb8pJG_W4lYKdE77nQvZNQ,7332
126
126
  dagster/_core/definitions/logger_invocation.py,sha256=0kAkCu-oSa4hGqlPrjJFW9kXLpZWKO6wi-1L0txl5II,698
127
127
  dagster/_core/definitions/materialize.py,sha256=1bls6kLDvUsWlJ_8lXjFlJiyljC4x7Y44YhmdsBAeT0,9430
@@ -135,7 +135,7 @@ dagster/_core/definitions/op_invocation.py,sha256=5YdGsAo8tfhCYXeatPzvgZ-Uo6h05Y
135
135
  dagster/_core/definitions/op_selection.py,sha256=Q8cqYHny9BVLP_TgeRUBUA_ItwpMNa43u2bA0RgJQ30,8699
136
136
  dagster/_core/definitions/output.py,sha256=6kXTThBhHqX3OZvQ-BjogxUkYbYv372-OmlbTbeJho8,19290
137
137
  dagster/_core/definitions/policy.py,sha256=3Y-4ARYjNulq2ycCCg2z1flOAAInsD8IERQaZiMyT1s,3811
138
- dagster/_core/definitions/reconstruct.py,sha256=hz2otYlYG0FJOIejxuU9obyvHRxXOX_GY6rxa5LLQMY,31877
138
+ dagster/_core/definitions/reconstruct.py,sha256=ejHsKQl1bz1mhOhWsgRgjhdLShkk-V7GzNxhCKkqUWo,31874
139
139
  dagster/_core/definitions/resolved_asset_deps.py,sha256=qIdsxz-5DiwRZdNg3hMF1-HeqcPNjq1DwlbR58sGWBU,10925
140
140
  dagster/_core/definitions/resource_annotation.py,sha256=gdQW4v0hnKUFi6LXm2vgrZ3TXOJA2HJYXkLRu9B5-zc,1619
141
141
  dagster/_core/definitions/resource_definition.py,sha256=AOOoltR3Jxgbns-V_LfYfmqgkC1YbFf3snwvGxlahLs,18048
@@ -194,9 +194,9 @@ dagster/_core/definitions/assets/definition/cacheable_assets_definition.py,sha25
194
194
  dagster/_core/definitions/assets/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  dagster/_core/definitions/assets/graph/asset_graph.py,sha256=7uC3IgCqjvVLlJ86G9Ko3woVm8ivS8qaIrTZyGFqK_I,13952
196
196
  dagster/_core/definitions/assets/graph/asset_graph_differ.py,sha256=ZgyJa3tD-58a5y8SbU10jn60FHQECGA3-FrspkMPyyY,8338
197
- dagster/_core/definitions/assets/graph/asset_graph_subset.py,sha256=eL_2YbF1zcxhuB1CJRBdt6-YoXw1RSR_uPZqDCwg8pU,18628
198
- dagster/_core/definitions/assets/graph/base_asset_graph.py,sha256=5qBafKAdu_K1XHIoTsWGNdRG5EJdpWc0BLX1r_cuqQU,32283
199
- dagster/_core/definitions/assets/graph/remote_asset_graph.py,sha256=Bk_rR9Rb6cVtGJGoxR5iHxMCqm2oyK6u9wJnZdpc614,33521
197
+ dagster/_core/definitions/assets/graph/asset_graph_subset.py,sha256=T44B8C2_J1UdnjCv-wROZHbAqACbGag06QM6dvpVgoI,17374
198
+ dagster/_core/definitions/assets/graph/base_asset_graph.py,sha256=kCFBREioJyltAXCwIqbQYUC7QL9VZHn1zgwB54Gho4I,32842
199
+ dagster/_core/definitions/assets/graph/remote_asset_graph.py,sha256=vCeHFRqHRb9W3PPZ0M8Kxw0_L6gna0LzLyjr2Jy9Rik,35164
200
200
  dagster/_core/definitions/assets/job/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  dagster/_core/definitions/assets/job/asset_in.py,sha256=c70Sx5_lH8C4aSRmOtL6mn2Jk18BFhpds-VWUcbMQBw,4065
202
202
  dagster/_core/definitions/assets/job/asset_job.py,sha256=FgJzVfsfDYUU8bHvNcTooGn3ROOnolrnjcsch8Wuk3o,30964
@@ -241,7 +241,7 @@ dagster/_core/definitions/decorators/sensor_decorator.py,sha256=BaieF1GcKdaONu3O
241
241
  dagster/_core/definitions/decorators/source_asset_decorator.py,sha256=KE9oCVlzaRNiUck_aP8n5vX7Ah8JQEOoXirwRW2E5YQ,14912
242
242
  dagster/_core/definitions/metadata/__init__.py,sha256=3udptTJSppffelN6ehwrArbfpS-LFwHa9MqYArTJqiA,10784
243
243
  dagster/_core/definitions/metadata/external_metadata.py,sha256=DphSm10HGxHACurNFhegFcAM8lOx67QePUsOyek6Yac,5040
244
- dagster/_core/definitions/metadata/metadata_set.py,sha256=8npbUlJwSg0pXrvAM7xP213Ii0y3ySNmsru470_SU98,7664
244
+ dagster/_core/definitions/metadata/metadata_set.py,sha256=nfEyUYSqHxWvM1mVohodLfxcLxv23wqz0KNiTlWs2x8,7801
245
245
  dagster/_core/definitions/metadata/metadata_value.py,sha256=vQdvYxfqWUWk7xe3sdNWmErTcyOx3iSJ7OSwuv-MJk8,33394
246
246
  dagster/_core/definitions/metadata/source_code.py,sha256=sc21_k_eH7ZaUeTQMWF3XYrBtCa3-yGSy9_gTiE149s,16350
247
247
  dagster/_core/definitions/metadata/table.py,sha256=PwXMIyKMn-eotPThhX6OPkyQqrealjs5KExo8WkTWU8,11097
@@ -260,9 +260,9 @@ dagster/_core/definitions/partitions/schedule_type.py,sha256=bSmF9ajRmBgo6GOm9LE
260
260
  dagster/_core/definitions/partitions/definition/__init__.py,sha256=UMbtK90ym1dqFVw31sFDfUxzbBCJMIICYaBfty8cRJA,1016
261
261
  dagster/_core/definitions/partitions/definition/dynamic.py,sha256=fUgdaIYaj_7avFoGzl6_YOUBrT3DX-crkF1ai_nLTMc,9271
262
262
  dagster/_core/definitions/partitions/definition/multi.py,sha256=9UBAiW7IkxpHQwlRFepOkPwnEKksDbTYOqxdyAKBfyU,20326
263
- dagster/_core/definitions/partitions/definition/partitions_definition.py,sha256=YbsV3OYOVahe5Hyn1wCBJr30lR8svy8hBBbsjGY0sGc,6866
263
+ dagster/_core/definitions/partitions/definition/partitions_definition.py,sha256=DndFn52CCxzeOhkH3qCS4T4i560pBnNlDvn2J3h6_jk,6933
264
264
  dagster/_core/definitions/partitions/definition/static.py,sha256=XJG_2ZGixkLY79Aj2057G4ZAAQbXbi13TQEldxkqJdg,3799
265
- dagster/_core/definitions/partitions/definition/time_window.py,sha256=2mxbmUIDXSiW2yOyDYFoN0nXZd86_iTFGBW2WhTct-g,51300
265
+ dagster/_core/definitions/partitions/definition/time_window.py,sha256=AxMMoSl9UthQJ6sjkNNPSlgBKqiuhH4ut0wDfk_SNUo,52058
266
266
  dagster/_core/definitions/partitions/definition/time_window_subclasses.py,sha256=JuB1R2G77TnQMcuz3qKBCvqFDsBjQaZkdFCl8BFhnVY,16625
267
267
  dagster/_core/definitions/partitions/mapping/__init__.py,sha256=c9ASNcN3xjCXAMXfFgW8dp5DM4qe7qu6b_A-J93IzsA,1435
268
268
  dagster/_core/definitions/partitions/mapping/all.py,sha256=oZJgLQn9LLzEzaIYA5XGTNMt6IEmav_8THm-OBVXLV0,3335
@@ -299,7 +299,7 @@ dagster/_core/definitions/repository_definition/__init__.py,sha256=wMlAvbzGwInb6
299
299
  dagster/_core/definitions/repository_definition/caching_index.py,sha256=fcSjlnpQl9aQUSkvTLl9S8cRvRtaV0L2fBRntR6M50k,6356
300
300
  dagster/_core/definitions/repository_definition/repository_data.py,sha256=WQ5rMoNANoZ3foi57X-_ZuYMWPA3aEbK4qfci8WGbi0,22442
301
301
  dagster/_core/definitions/repository_definition/repository_data_builder.py,sha256=_WUyaVtgr08LZiN9kZqLOViePakfjA5N9fdPKzt6nyc,25545
302
- dagster/_core/definitions/repository_definition/repository_definition.py,sha256=xkmLo36NbSPpD5750IxKqGxVfDHMfPC7Ewg0YgPdtqM,17958
302
+ dagster/_core/definitions/repository_definition/repository_definition.py,sha256=8c0Rx2aJIS2hMc1bshLcpGQ_O4ojkFXw2GWoehhjYyU,17950
303
303
  dagster/_core/definitions/repository_definition/valid_definitions.py,sha256=d02UZtYJrWk4fWDuJvK6PfyByM9kggeL40b2cTfuQpY,1624
304
304
  dagster/_core/definitions/tags/__init__.py,sha256=DwmOAOmGGojK7DCC9Wcsyov7Mg4g9onmllRzURWIc48,501
305
305
  dagster/_core/definitions/tags/tag_set.py,sha256=jvtLl4lP2q69dEyJzJuz097NiQYUwrjl9nHakiuJ4Eg,1946
@@ -307,8 +307,8 @@ dagster/_core/events/__init__.py,sha256=PnK29O4NvGBZVVDIgjRgzQ5GGGDvE7vjp1sEOpoW
307
307
  dagster/_core/events/log.py,sha256=bPlxKl3FqD7IWSQ0A9vr047bv-LXJrLldXGCj1T2ro8,8155
308
308
  dagster/_core/events/utils.py,sha256=jaimJ6URJeSCizthpOHC1z5P0DFhV1gnhBvqvXHsREw,1620
309
309
  dagster/_core/execution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
310
- dagster/_core/execution/api.py,sha256=gTSLXJ8CP_N826XA2JJW5GwdIyvRjlmHD3Jw-VaxR2k,39240
311
- dagster/_core/execution/asset_backfill.py,sha256=FLRSum4aU0Prk6heOl1JWR1dWNlp6AtzbrxdpQ7SFus,96974
310
+ dagster/_core/execution/api.py,sha256=jmpi-XBbm7WSj6c8cL8U3mbw3pdUhjtUQHMIuGOQKNY,39237
311
+ dagster/_core/execution/asset_backfill.py,sha256=skuURuv_mwb8Aj_OPWu64Ze90i2FOJilwx261Lb8imU,97848
312
312
  dagster/_core/execution/backfill.py,sha256=tjwAL6MxRgH6su6WBR2rWNh63N822iYd_bAwrp5l4Bs,25419
313
313
  dagster/_core/execution/build_resources.py,sha256=jQLPC2miYv-kXRpHf4V1jFzrUMf2X7CbYN0Qa8S3ew4,6686
314
314
  dagster/_core/execution/bulk_actions.py,sha256=QhuivhWDehXBui5qteYe0FmgIYvZsjlJv27uScZjU5M,224
@@ -343,7 +343,7 @@ dagster/_core/execution/context/input.py,sha256=YU7lsQnE8YhEkE0hpeX9MQJm8vlSCB6d
343
343
  dagster/_core/execution/context/invocation.py,sha256=qswshTEgBNpMGagsTx0RldTJk-Oxt3xh65ZipPayzOs,45559
344
344
  dagster/_core/execution/context/logger.py,sha256=fNivic7By_w8yha2x8-FIFBsFW7t1kJP-CzpasbKuNw,3150
345
345
  dagster/_core/execution/context/metadata_logging.py,sha256=AEPYHbQx8bVKDkEnZZrAYNShfiTp9TSLuTsvJpDiQOI,2511
346
- dagster/_core/execution/context/op_execution_context.py,sha256=1sP9I9Ab69OMLLKAqcc8jgQU99Mlhji7ko9g5vGqcdI,53288
346
+ dagster/_core/execution/context/op_execution_context.py,sha256=vSSissUnE1UKLrw-S6fTwaNOx0safH3oA5P0b9stSiQ,53865
347
347
  dagster/_core/execution/context/output.py,sha256=fcOFEtcXB7tUiGnzTD3hwU9F4dGEpzC5aEBSjftVn94,37149
348
348
  dagster/_core/execution/context/system.py,sha256=cey6BY-Ge4pOmNLvvW64hLK_evVJmdr9-jk2ni3Qlfs,55383
349
349
  dagster/_core/execution/plan/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -368,19 +368,19 @@ dagster/_core/execution/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
368
368
  dagster/_core/execution/scripts/poll_compute_logs.py,sha256=5yeqzKsNmDdy_VC33KkT9SswRqTmsYElsdYie9N8kqs,1757
369
369
  dagster/_core/execution/scripts/watch_orphans.py,sha256=BXhrRP7j2WUk3WsrgXdxR84OaNOqLRG1FwQLEnWsrvs,1282
370
370
  dagster/_core/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
371
- dagster/_core/executor/base.py,sha256=I2zuQRuyiJKF01SGN1U9U3N14R5s0R4TlILkgUulslc,4070
371
+ dagster/_core/executor/base.py,sha256=Mv8lnM8qeVpjTbyfAK_Awl5x8q8CBtIuUAqHXwXmHIU,4088
372
372
  dagster/_core/executor/child_process_executor.py,sha256=xRF5B7VadGzHF_eAT-dDiR5HoaqtBTBthYeVhf7cUY8,5897
373
373
  dagster/_core/executor/in_process.py,sha256=nh9lnjHZYuMqfRQ9dG9BWlhnOS_kKDvYP8nXb5LAAsk,4024
374
374
  dagster/_core/executor/init.py,sha256=Sg1ZPhGcJbDWzm7-LgK19XvU1Dvx-vey4j_gZ1EhKdY,1522
375
- dagster/_core/executor/multiprocess.py,sha256=HtyCa4x1rsbHV39Vk0PlnFl7--l_N-gbts2fmI7jAhk,19353
375
+ dagster/_core/executor/multiprocess.py,sha256=2vuiWoFdB0cPMoToerBFUveWk_Di_QRl0RdlsaQGHis,19353
376
376
  dagster/_core/executor/step_delegating/__init__.py,sha256=X9x97D0C-_-38D9FsW5VspqfwL2gpojtB9vFgxnjB-4,332
377
- dagster/_core/executor/step_delegating/step_delegating_executor.py,sha256=r3yPweGo1_MORBhU8unBjWaZv54DzoPGlB7J8BfU7hA,21562
377
+ dagster/_core/executor/step_delegating/step_delegating_executor.py,sha256=D1iHWqBaSrxRTYHwe8RpsPsspLS6AdHvL_M0I1ZrYew,21261
378
378
  dagster/_core/executor/step_delegating/step_handler/__init__.py,sha256=7PQNv2M79kcBMra-vDMMTmHJ5PzZcxFdqGTUgHVgttc,203
379
379
  dagster/_core/executor/step_delegating/step_handler/base.py,sha256=bz-1km5JyhlCPnmDZiHysluMizqgNvj1iQHfWHPUYSs,3079
380
380
  dagster/_core/instance/__init__.py,sha256=6UHHmrlCY_tYggl1y5ZQ2vvZLRq99S1FSA4dEKJ235k,1293
381
381
  dagster/_core/instance/config.py,sha256=0dq42eK_L8GbfvuGDIBGnSx0nOldtvlo8uQbuXaHtaA,26762
382
382
  dagster/_core/instance/factory.py,sha256=P5faontUcLY025-sBBIwTYaRxSEeIxd9-XWwXqNhm9U,7606
383
- dagster/_core/instance/instance.py,sha256=BHydU4038c13mCWabJLdSKzlTQDB5oEodLAfVFiWoVc,39035
383
+ dagster/_core/instance/instance.py,sha256=ztpEzVJ8Lm6wU0t5AyCsmB3Owt57B4_jHqmmG0HDSpA,39032
384
384
  dagster/_core/instance/ref.py,sha256=GxVwoWbAUrVhSPL64KrYq4W5iTOf9l0jVMiYtoE9UII,25927
385
385
  dagster/_core/instance/types.py,sha256=ghmEE-NgoaFW9d4xozJxTamWZH8XpBOw9m76Kd_xrBo,10018
386
386
  dagster/_core/instance/utils.py,sha256=wR6K3qyfmYuTZlDFale6hiz8IbZwstuu3Lme7Sx5MQc,2999
@@ -395,7 +395,7 @@ dagster/_core/instance/methods/scheduling_methods.py,sha256=p8PYQIdRXVzxg5-U-c7I
395
395
  dagster/_core/instance/methods/settings_methods.py,sha256=rARrVm00JGwBnz5av-UnDtABynTIjd2LuG8fCBeEbpo,8382
396
396
  dagster/_core/instance/methods/storage_methods.py,sha256=84AFCeEsYj3Vk3CJfUxwnkZpfOZPM8GVYn8L22HKmcE,4288
397
397
  dagster/_core/instance/runs/__init__.py,sha256=uRqAo-gjmsiICHb_qI7h9jKwLoGKBKu-2MLQw575RCQ,34
398
- dagster/_core/instance/runs/run_domain.py,sha256=p-ySv24GSoA9qi6Hk9asOyAWhXAPTt1S9xAX_vXg8H0,47486
398
+ dagster/_core/instance/runs/run_domain.py,sha256=3DYvyrimdP-qtlegMZMcIrZcZ1-93qa6IvZG_pPNpUw,47942
399
399
  dagster/_core/instance/storage/__init__.py,sha256=kIhh24GXtt-sr9-OmpLjo8oxU9NKJFuuK59T21wrq4c,32
400
400
  dagster/_core/launcher/__init__.py,sha256=DIMRPl1ewoVwkHalJHBenIrY613ayFY4siFy-LS4PlA,341
401
401
  dagster/_core/launcher/base.py,sha256=sFqNIgpJdrd3fOXjm94B0KW9YGo-uwZIFoJiJCNyKFQ,3975
@@ -431,7 +431,7 @@ dagster/_core/secrets/__init__.py,sha256=IfDPSHxybLX0LUO1437ylFQfHzONhw54-NIz5uj
431
431
  dagster/_core/secrets/env_file.py,sha256=MVgeGILctWVUyQG_6ayJI4VSKJWpqe2uTMFST5gzgLc,3603
432
432
  dagster/_core/secrets/loader.py,sha256=ELKcddoY_s288wiAqj3ojWEZJJl0plFittS_5SJR-Z4,415
433
433
  dagster/_core/selector/__init__.py,sha256=zHW8p1gqvzC5Pe509crYBO8FbmQDDIxepVg6Fad-wPQ,317
434
- dagster/_core/selector/subset_selector.py,sha256=gto61EfJAfP88oyJr7rFdmpknzeQXmb6F-kYkBpRn8k,17709
434
+ dagster/_core/selector/subset_selector.py,sha256=o-GKOFmZ33tOzE3CsHOTas5d_4RJCK7pJLJzYcfnvCY,17717
435
435
  dagster/_core/snap/__init__.py,sha256=0ZXvYicZC79gIpCmlOkCtAxlAHwv3EhR_NWKrsI9zro,2905
436
436
  dagster/_core/snap/config_types.py,sha256=eP6eFKus93kmc3FehFEHshBq9TMYYSLwpnLodCabLkk,494
437
437
  dagster/_core/snap/dagster_types.py,sha256=lcn5Dv5M4uUAo6hR8_V7-kLPYTbK5M1qe0r4rVvCV6A,3973
@@ -439,7 +439,7 @@ dagster/_core/snap/dep_snapshot.py,sha256=_ln6vrgG9HLWldXS2-U0vmNPdGPjiHBojSJEA8
439
439
  dagster/_core/snap/execution_plan_snapshot.py,sha256=hlGFfhKUctzktpGcfuptZLhNKgGq25en9wDVTbrnRb8,13707
440
440
  dagster/_core/snap/job_snapshot.py,sha256=1kPnphm1o6dNzgDli8Tg1O2KFxkW1m9OEkWqb50ZO-k,16217
441
441
  dagster/_core/snap/mode.py,sha256=nweBDcB6ijQlwKd3jctfi_OHcWfiPYUw8g7QpY_IXX4,4534
442
- dagster/_core/snap/node.py,sha256=_sHv_-FRKFvEIU4FXG0Dr01al-N0q-r34ypk_3t9zW4,10337
442
+ dagster/_core/snap/node.py,sha256=TdJJMelZaoM5Im6CbcNEsiS2nmWKcm5SSehjVe7zkOU,10995
443
443
  dagster/_core/snap/snap_to_yaml.py,sha256=iDKEsKVhfIWQ62PTMIEd6Kb9Vr4_qIN-1ywEuP7hfvY,4956
444
444
  dagster/_core/storage/DEVELOPING.md,sha256=PsXFNmwC4oMADf8IjapMl_0hNeDXGDdgOPJfWQMAEqc,3058
445
445
  dagster/_core/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -467,9 +467,9 @@ dagster/_core/storage/sql.py,sha256=M1l01vs5amQhqTlQXqTrJMMjJJEhtSqf-CkHuNKzsVg,
467
467
  dagster/_core/storage/sqlalchemy_compat.py,sha256=hJkTCEvWVCs8Dl2NF6XLl_ZTD5HguwkUCH1rvBOyqPs,1418
468
468
  dagster/_core/storage/sqlite.py,sha256=UJBxJB2LjthTIyo_vlSM3E8SZ-eTkNS-bbvkUgqlwX0,987
469
469
  dagster/_core/storage/sqlite_storage.py,sha256=6S0dAfWWTS2gI9NUF1JoIjFSezCWD5hss2urzhe7YMs,5118
470
- dagster/_core/storage/tags.py,sha256=b1kXxyqfmQB_HO28UtgEhsHSE_dXsmR5arMfwoE7pGE,4989
470
+ dagster/_core/storage/tags.py,sha256=scNRylKjx8BRXlm9LeLUt2QDh9R1O2alhyKlVVWhVdQ,5046
471
471
  dagster/_core/storage/temp_file_manager.py,sha256=G3DypR7gVZ-KYDkeQYQ6xTt8FvziosTV08IJzWJxnBc,1186
472
- dagster/_core/storage/upath_io_manager.py,sha256=hXvtlUM8b55bJFpnYObHN0pUAWkZai8SWY3zE8nihg8,20014
472
+ dagster/_core/storage/upath_io_manager.py,sha256=ZOUXc5b7lXtS7UdV_XK9iAgLQqG3dYmcuERMvBztaeA,19982
473
473
  dagster/_core/storage/alembic/README.md,sha256=Wd_be8adt27LqpZIAuLVcsi9gYM9BqCWh0CBs1kkTzY,6686
474
474
  dagster/_core/storage/alembic/env.py,sha256=dgRQTL9K7b6q5oz0is1Tst18j3vJm3oeZDNPaT4Kn9c,687
475
475
  dagster/_core/storage/alembic/script.py.mako,sha256=8_xgA-gm_OhehnO7CiIijWgnm00ZlszEHtIHrAYFJl0,494
@@ -559,7 +559,9 @@ dagster/_core/storage/alembic/versions/045_1aca709bba64_add_runs_table_backfill_
559
559
  dagster/_core/storage/alembic/versions/046_16e3655b4d9b045_add_bulk_actions_job_name_column_and_tags_table.py,sha256=eXf5BlgFGP49HNOqN87S6dF0VF6QYdmr1F7jppUJDl8,1887
560
560
  dagster/_core/storage/alembic/versions/047_add_run_tags_run_id_idx.py,sha256=yLAJW8NeGGU2P43V0ck9J4JwLWObw3EipLchOwzUStA,1545
561
561
  dagster/_core/storage/alembic/versions/048_7e2f3204cf8e_add_column_concurrency_default_limit.py,sha256=zecovfh9K-P9EWqoFgljiFzxrQnkcU4HGLu4KdGmJeU,1040
562
+ dagster/_core/storage/alembic/versions/29b539ebc72a_use_longtext_on_bulk_actions_body_in_.py,sha256=DnNeowQ_pQ92Qa99RtEtbmOKF9Qbv8bJMfZo-mtmn3g,1102
562
563
  dagster/_core/storage/alembic/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
564
+ dagster/_core/storage/alembic/versions/f495c27d5019_use_longtext_on_asset_keys_cached_.py,sha256=NJ0OcTExBLI5aBvFzhm8nVdxh0FixPmDgXcu-QBDIrQ,1138
563
565
  dagster/_core/storage/branching/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
564
566
  dagster/_core/storage/branching/branching_io_manager.py,sha256=i-xVVHPRYQSf8-zAeF6SlILXf_xBJsWl_sN_2NFCbWE,5400
565
567
  dagster/_core/storage/defs_state/__init__.py,sha256=0WtIMSuG58s7GB7i-hcGs819p6rez_b9jpgEVBzbGxA,215
@@ -570,7 +572,7 @@ dagster/_core/storage/event_log/base.py,sha256=nrnxXjsHs2ZPtIoNGH0QXdGxurVX7Efh5
570
572
  dagster/_core/storage/event_log/in_memory.py,sha256=69Xr_CQmUKCYwN9bqj0UeaQyje-afvBtwImRguvwJFs,3968
571
573
  dagster/_core/storage/event_log/migration.py,sha256=lYAt0274GDkBhSokaDn-XcaRP8hQi7fitzIsNptHBS0,7746
572
574
  dagster/_core/storage/event_log/polling_event_watcher.py,sha256=buSAd86687K0ZU5lFrldgLKQetSmur44I0VhtePqVeI,8267
573
- dagster/_core/storage/event_log/schema.py,sha256=XPzzGAATOIWWned1OrhEwO8N_FuXXHBExzYa2ckaqeo,9595
575
+ dagster/_core/storage/event_log/schema.py,sha256=Fu86AF9XdN5xkre2hnv0NIN_gH0NJMmyN7erq9qC-AQ,9620
574
576
  dagster/_core/storage/event_log/sql_event_log.py,sha256=yx5T7qy9Nfxj5xFe6KcMgkzjNDlx0hkxnEubr9MRQpk,138788
575
577
  dagster/_core/storage/event_log/sqlite/__init__.py,sha256=T3eBD9JhH-rqX6X6AWLi8f-qdMlIoOlzkVih8Ah_4eM,285
576
578
  dagster/_core/storage/event_log/sqlite/consolidated_sqlite_event_log.py,sha256=mRThLWzzz2DyitFRi6tykiJCEIT40frg6y-sIEpH-LQ,7612
@@ -583,7 +585,7 @@ dagster/_core/storage/runs/__init__.py,sha256=Vfjtc_Uz1rM7JJTZjBvR21s1b16toCfRb6
583
585
  dagster/_core/storage/runs/base.py,sha256=ARENVVno_1_ZLTSjw45fuKTeg2IDthExkUTbkQmzDR8,13885
584
586
  dagster/_core/storage/runs/in_memory.py,sha256=8ceDjiZJCYPswiCh2H4g-rcCaA0Wwr_S9pQWgUH3NDI,2859
585
587
  dagster/_core/storage/runs/migration.py,sha256=pqgQ8Hbi7AkDUk3NXUgzk-wQh-802oNqIlpLl1fu7oI,15243
586
- dagster/_core/storage/runs/schema.py,sha256=zad8HbjZI6MpY-RbuCG_7sh3gTJpbaGEXnONpjkfEx4,7243
588
+ dagster/_core/storage/runs/schema.py,sha256=6YarYzndOBjVtqHPRpbDEYHATDhFpFt0mSyWokMuNrU,7268
587
589
  dagster/_core/storage/runs/sql_run_storage.py,sha256=HVst3CBkBXlu_oP82bSB7z2-T9MCNQhF1Ex6PNijVyM,47102
588
590
  dagster/_core/storage/runs/sqlite/__init__.py,sha256=OvHIG9P6W-p6UMzRDdB770IX1-qOkelcW7himKSMg_A,111
589
591
  dagster/_core/storage/runs/sqlite/sqlite_run_storage.py,sha256=OWu45Vv33_RXmWPWD1fvM6xZhS0lHX9rZ6CCdgtc8Ts,7309
@@ -640,7 +642,7 @@ dagster/_daemon/run_coordinator/__init__.py,sha256=bGB6eE5Qujr9tpPaXuHXbzioywsc9
640
642
  dagster/_daemon/run_coordinator/queued_run_coordinator_daemon.py,sha256=qu2NQCFJ7YIFydb8zyfpeyOwZZXdaK5Sat3rP5O94Wc,20211
641
643
  dagster/_experimental/__init__.py,sha256=neUdP3MLSFZjVTpc_mraGEkrt-SEAiYJGeX44JzyMlk,300
642
644
  dagster/_generate/__init__.py,sha256=RctCCaSawF_t6F2XkN48ytPX-VqRjAEHC09d6P3Of88,233
643
- dagster/_generate/download.py,sha256=JP3LW9w6STJT47SaYf-skePJW6yTATv9c1Smvo2F3Jg,3277
645
+ dagster/_generate/download.py,sha256=984QWtHFRswfD6USOlYt6Yr2_xBxZL3EgOEP1JvrFqw,3346
644
646
  dagster/_generate/generate.py,sha256=vNOP3n9p8QOwYP-2V7Su4tA08YxgmlSrj0tfA24ByFo,1422
645
647
  dagster/_generate/templates/PROJECT_NAME_PLACEHOLDER/README.md.jinja,sha256=pRETiGTZ6_W87mw2x3qB_TU-J1i3nGpWQWZh0PnXdOk,1742
646
648
  dagster/_generate/templates/PROJECT_NAME_PLACEHOLDER/pyproject.toml.jinja,sha256=-Xu-80ZRhpWX4g7x6Fhmmm6iEXzB4RP8oUn9AJQ8qI4,546
@@ -822,9 +824,9 @@ dagster/components/utils/translation.py,sha256=gKal6ZdMbYImiBLZVa9E2pz4690j8Hukf
822
824
  dagster/deprecated/__init__.py,sha256=fkuCwd_79EmS-Voox0YlWEHWxZwQ0ZM_V0viwxw5isw,127
823
825
  dagster/preview/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
824
826
  dagster/preview/freshness/__init__.py,sha256=zq0UU-3mnxycgJDtAZ9DFWiBh4eXxKCaKbeuRmUl3_Y,276
825
- dagster-1.12.8.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
826
- dagster-1.12.8.dist-info/METADATA,sha256=9M5KAkrpYHB-HlgJArigvtjGhvZxcteNrq9oiXE3wmo,12164
827
- dagster-1.12.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
828
- dagster-1.12.8.dist-info/entry_points.txt,sha256=D4W0jf1lM8zq82j3DJd9JkZEmHdFz5gkz8ddRzOEzpc,139
829
- dagster-1.12.8.dist-info/top_level.txt,sha256=Gx3NqlMQh6AsfIZaJJXEfep5yh-e9pUxkzOlUV3s6CM,8
830
- dagster-1.12.8.dist-info/RECORD,,
827
+ dagster-1.12.9.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
828
+ dagster-1.12.9.dist-info/METADATA,sha256=TCD729Hh5xAf4zQE3qQeVgsv-RkGQhfi73Q1PmFTnXw,12215
829
+ dagster-1.12.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
830
+ dagster-1.12.9.dist-info/entry_points.txt,sha256=D4W0jf1lM8zq82j3DJd9JkZEmHdFz5gkz8ddRzOEzpc,139
831
+ dagster-1.12.9.dist-info/top_level.txt,sha256=Gx3NqlMQh6AsfIZaJJXEfep5yh-e9pUxkzOlUV3s6CM,8
832
+ dagster-1.12.9.dist-info/RECORD,,