dagster 1.12.3__py3-none-any.whl → 1.12.4__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 (29) hide show
  1. dagster/_config/pythonic_config/conversion_utils.py +2 -1
  2. dagster/_config/pythonic_config/resource.py +4 -2
  3. dagster/_config/source.py +17 -6
  4. dagster/_core/definitions/asset_daemon_cursor.py +4 -3
  5. dagster/_core/definitions/asset_sensor_definition.py +61 -1
  6. dagster/_core/definitions/automation_condition_sensor_definition.py +59 -2
  7. dagster/_core/definitions/metadata/metadata_value.py +4 -3
  8. dagster/_core/definitions/multi_asset_sensor_definition.py +64 -2
  9. dagster/_core/definitions/op_definition.py +10 -2
  10. dagster/_core/definitions/reconstruct.py +0 -6
  11. dagster/_core/definitions/run_status_sensor_definition.py +79 -1
  12. dagster/_core/definitions/sensor_definition.py +32 -21
  13. dagster/_core/execution/plan/objects.py +3 -1
  14. dagster/_core/remote_representation/code_location.py +11 -13
  15. dagster/_core/remote_representation/handle.py +4 -2
  16. dagster/_core/workspace/context.py +2 -0
  17. dagster/_core/workspace/workspace.py +6 -0
  18. dagster/_daemon/asset_daemon.py +42 -9
  19. dagster/_utils/error.py +1 -1
  20. dagster/components/component/component.py +10 -5
  21. dagster/components/testing/__init__.py +1 -0
  22. dagster/components/testing/utils.py +17 -16
  23. dagster/version.py +1 -1
  24. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/METADATA +3 -3
  25. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/RECORD +29 -29
  26. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/WHEEL +0 -0
  27. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/entry_points.txt +0 -0
  28. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/licenses/LICENSE +0 -0
  29. {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/top_level.txt +0 -0
@@ -148,7 +148,8 @@ def _convert_pydantic_field(
148
148
  config=config_type,
149
149
  description=pydantic_field.description,
150
150
  is_required=pydantic_field.is_required()
151
- and not is_closed_python_optional_type(field_type),
151
+ and not is_closed_python_optional_type(field_type)
152
+ and default_to_pass == FIELD_NO_DEFAULT_PROVIDED,
152
153
  default_value=default_to_pass,
153
154
  )
154
155
 
@@ -704,7 +704,7 @@ class PartialResource(
704
704
  resource_cls: type[ConfigurableResourceFactory[TResValue]],
705
705
  data: dict[str, Any],
706
706
  ):
707
- resource_pointers, _data_without_resources = separate_resource_params(resource_cls, data)
707
+ resource_pointers, data_without_resources = separate_resource_params(resource_cls, data)
708
708
 
709
709
  super().__init__(data=data, resource_cls=resource_cls) # type: ignore # extends BaseModel, takes kwargs
710
710
 
@@ -724,7 +724,9 @@ class PartialResource(
724
724
  k: v for k, v in resource_pointers.items() if (not _is_fully_configured(v))
725
725
  },
726
726
  config_schema=infer_schema_from_config_class(
727
- resource_cls, fields_to_omit=set(resource_pointers.keys())
727
+ resource_cls,
728
+ fields_to_omit=set(resource_pointers.keys()),
729
+ default=data_without_resources,
728
730
  ),
729
731
  resource_fn=resource_fn,
730
732
  description=resource_cls.__doc__,
dagster/_config/source.py CHANGED
@@ -60,12 +60,17 @@ class IntSourceType(ScalarUnion):
60
60
  key, cfg = next(iter(value.items()))
61
61
  check.invariant(key == "env", "Only valid key is env")
62
62
  value = _ensure_env_variable(cfg)
63
+ validation_failed = False
63
64
  try:
64
65
  return int(value)
65
- except ValueError as e:
66
+ except ValueError:
67
+ # raise exception separately to ensure the exception chain doesn't leak the value of the env var
68
+ validation_failed = True
69
+
70
+ if validation_failed:
66
71
  raise PostProcessingError(
67
- f'Value "{value}" stored in env variable "{cfg}" cannot be coerced into an int.'
68
- ) from e
72
+ f'Value stored in env variable "{cfg}" cannot be coerced into an int.'
73
+ )
69
74
 
70
75
 
71
76
  class BoolSourceType(ScalarUnion):
@@ -87,12 +92,18 @@ class BoolSourceType(ScalarUnion):
87
92
  key, cfg = next(iter(value.items()))
88
93
  check.invariant(key == "env", "Only valid key is env")
89
94
  value = _ensure_env_variable(cfg)
95
+ validation_failed = False
96
+
90
97
  try:
91
98
  return get_boolean_string_value(value)
92
- except ValueError as e:
99
+ except ValueError:
100
+ # raise exception separately to ensure the exception chain doesn't leak the value of the env var
101
+ validation_failed = True
102
+
103
+ if validation_failed:
93
104
  raise PostProcessingError(
94
- f'Value "{value}" stored in env variable "{cfg}" cannot be coerced into an bool.'
95
- ) from e
105
+ f'Value stored in env variable "{cfg}" cannot be coerced into an bool.'
106
+ )
96
107
 
97
108
 
98
109
  StringSource: StringSourceType = StringSourceType()
@@ -11,9 +11,10 @@ from dagster_shared.serdes.serdes import (
11
11
  PackableValue,
12
12
  SerializableNonScalarKeyMapping,
13
13
  UnpackContext,
14
+ UnpackedValue,
14
15
  WhitelistMap,
16
+ inner_unpack_value,
15
17
  pack_value,
16
- unpack_value,
17
18
  whitelist_for_serdes,
18
19
  )
19
20
 
@@ -53,8 +54,8 @@ class ObserveRequestTimestampSerializer(FieldSerializer):
53
54
  unpacked_value: JsonSerializableValue,
54
55
  whitelist_map: WhitelistMap,
55
56
  context: UnpackContext,
56
- ) -> PackableValue:
57
- return unpack_value(unpacked_value, dict, whitelist_map, context)
57
+ ) -> UnpackedValue:
58
+ return inner_unpack_value(unpacked_value, whitelist_map, context)
58
59
 
59
60
 
60
61
  @whitelist_for_serdes(
@@ -14,10 +14,12 @@ from dagster._core.definitions.sensor_definition import (
14
14
  SensorDefinition,
15
15
  SensorReturnTypesUnion,
16
16
  SensorType,
17
+ resolve_jobs_from_targets_for_with_attributes,
17
18
  validate_and_get_resource_dict,
18
19
  )
19
20
  from dagster._core.definitions.target import ExecutableDefinition
20
21
  from dagster._core.definitions.utils import check_valid_name
22
+ from dagster._utils import IHasInternalInit
21
23
 
22
24
 
23
25
  class AssetSensorParamNames(NamedTuple):
@@ -44,7 +46,7 @@ def get_asset_sensor_param_names(fn: Callable[..., Any]) -> AssetSensorParamName
44
46
 
45
47
 
46
48
  @public
47
- class AssetSensorDefinition(SensorDefinition):
49
+ class AssetSensorDefinition(SensorDefinition, IHasInternalInit):
48
50
  """Define an asset sensor that initiates a set of runs based on the materialization of a given
49
51
  asset.
50
52
 
@@ -95,6 +97,8 @@ class AssetSensorDefinition(SensorDefinition):
95
97
  metadata: Optional[RawMetadataMapping] = None,
96
98
  ):
97
99
  self._asset_key = check.inst_param(asset_key, "asset_key", AssetKey)
100
+ self._asset_materialization_fn = asset_materialization_fn
101
+ self._job_name = job_name
98
102
 
99
103
  from dagster._core.event_api import AssetRecordsFilter
100
104
 
@@ -106,6 +110,7 @@ class AssetSensorDefinition(SensorDefinition):
106
110
  check.opt_set_param(required_resource_keys, "required_resource_keys", of_type=str)
107
111
  | resource_arg_names
108
112
  )
113
+ self._raw_required_resource_keys = combined_required_resource_keys
109
114
 
110
115
  def _wrap_asset_fn(materialization_fn) -> Any:
111
116
  def _fn(context) -> Any:
@@ -184,3 +189,58 @@ class AssetSensorDefinition(SensorDefinition):
184
189
  @property
185
190
  def sensor_type(self) -> SensorType:
186
191
  return SensorType.ASSET
192
+
193
+ @staticmethod
194
+ def dagster_internal_init( # type: ignore
195
+ *,
196
+ name: str,
197
+ asset_key: AssetKey,
198
+ job_name: Optional[str],
199
+ asset_materialization_fn: Callable[..., SensorReturnTypesUnion],
200
+ minimum_interval_seconds: Optional[int],
201
+ description: Optional[str],
202
+ job: Optional[ExecutableDefinition],
203
+ jobs: Optional[Sequence[ExecutableDefinition]],
204
+ default_status: DefaultSensorStatus,
205
+ required_resource_keys: Optional[set[str]],
206
+ tags: Optional[Mapping[str, str]],
207
+ metadata: Optional[RawMetadataMapping],
208
+ ) -> "AssetSensorDefinition":
209
+ return AssetSensorDefinition(
210
+ name=name,
211
+ asset_key=asset_key,
212
+ job_name=job_name,
213
+ asset_materialization_fn=asset_materialization_fn,
214
+ minimum_interval_seconds=minimum_interval_seconds,
215
+ description=description,
216
+ job=job,
217
+ jobs=jobs,
218
+ default_status=default_status,
219
+ required_resource_keys=required_resource_keys,
220
+ tags=tags,
221
+ metadata=metadata,
222
+ )
223
+
224
+ def with_attributes(
225
+ self,
226
+ *,
227
+ jobs: Optional[Sequence[ExecutableDefinition]] = None,
228
+ metadata: Optional[RawMetadataMapping] = None,
229
+ ) -> "AssetSensorDefinition":
230
+ """Returns a copy of this sensor with the attributes replaced."""
231
+ job_name, new_job, new_jobs = resolve_jobs_from_targets_for_with_attributes(self, jobs)
232
+
233
+ return AssetSensorDefinition.dagster_internal_init(
234
+ name=self.name,
235
+ asset_key=self._asset_key,
236
+ job_name=job_name,
237
+ asset_materialization_fn=self._asset_materialization_fn,
238
+ minimum_interval_seconds=self.minimum_interval_seconds,
239
+ description=self.description,
240
+ job=new_job,
241
+ jobs=new_jobs,
242
+ default_status=self.default_status,
243
+ required_resource_keys=self._raw_required_resource_keys,
244
+ tags=self._tags,
245
+ metadata=metadata if metadata is not None else self._metadata,
246
+ )
@@ -1,4 +1,4 @@
1
- from collections.abc import Mapping
1
+ from collections.abc import Mapping, Sequence
2
2
  from functools import partial
3
3
  from typing import Any, Optional, cast
4
4
 
@@ -16,8 +16,10 @@ from dagster._core.definitions.sensor_definition import (
16
16
  SensorEvaluationContext,
17
17
  SensorType,
18
18
  )
19
+ from dagster._core.definitions.target import ExecutableDefinition
19
20
  from dagster._core.definitions.utils import check_valid_name
20
21
  from dagster._core.errors import DagsterInvalidInvocationError
22
+ from dagster._utils import IHasInternalInit
21
23
  from dagster._utils.tags import normalize_tags
22
24
 
23
25
  MAX_ENTITIES = 500
@@ -79,7 +81,7 @@ def not_supported(context) -> None:
79
81
  @public
80
82
  @beta_param(param="use_user_code_server")
81
83
  @beta_param(param="default_condition")
82
- class AutomationConditionSensorDefinition(SensorDefinition):
84
+ class AutomationConditionSensorDefinition(SensorDefinition, IHasInternalInit):
83
85
  """Targets a set of assets and repeatedly evaluates all the AutomationConditions on all of
84
86
  those assets to determine which to request runs for.
85
87
 
@@ -171,6 +173,8 @@ class AutomationConditionSensorDefinition(SensorDefinition):
171
173
  )
172
174
 
173
175
  self._run_tags = normalize_tags(run_tags)
176
+ self._sensor_target = target
177
+ self._emit_backfills = emit_backfills
174
178
 
175
179
  # only store this value in the metadata if it's True
176
180
  if emit_backfills:
@@ -210,3 +214,56 @@ class AutomationConditionSensorDefinition(SensorDefinition):
210
214
  @property
211
215
  def sensor_type(self) -> SensorType:
212
216
  return SensorType.AUTOMATION if self._use_user_code_server else SensorType.AUTO_MATERIALIZE
217
+
218
+ @staticmethod
219
+ def dagster_internal_init( # type: ignore
220
+ *,
221
+ name: str,
222
+ target: CoercibleToAssetSelection,
223
+ tags: Optional[Mapping[str, str]],
224
+ run_tags: Optional[Mapping[str, Any]],
225
+ default_status: DefaultSensorStatus,
226
+ minimum_interval_seconds: Optional[int],
227
+ description: Optional[str],
228
+ metadata: Optional[RawMetadataMapping],
229
+ emit_backfills: bool,
230
+ use_user_code_server: bool,
231
+ default_condition: Optional[AutomationCondition],
232
+ ) -> "AutomationConditionSensorDefinition":
233
+ return AutomationConditionSensorDefinition(
234
+ name=name,
235
+ target=target,
236
+ tags=tags,
237
+ run_tags=run_tags,
238
+ default_status=default_status,
239
+ minimum_interval_seconds=minimum_interval_seconds,
240
+ description=description,
241
+ metadata=metadata,
242
+ emit_backfills=emit_backfills,
243
+ use_user_code_server=use_user_code_server,
244
+ default_condition=default_condition,
245
+ )
246
+
247
+ def with_attributes(
248
+ self,
249
+ *,
250
+ jobs: Optional[Sequence[ExecutableDefinition]] = None,
251
+ metadata: Optional[RawMetadataMapping] = None,
252
+ ) -> "AutomationConditionSensorDefinition":
253
+ """Returns a copy of this sensor with the attributes replaced.
254
+
255
+ Note: jobs parameter is ignored for AutomationConditionSensorDefinition as it doesn't use jobs.
256
+ """
257
+ return AutomationConditionSensorDefinition.dagster_internal_init(
258
+ name=self.name,
259
+ target=self._sensor_target,
260
+ tags=self._tags,
261
+ run_tags=self._run_tags,
262
+ default_status=self.default_status,
263
+ minimum_interval_seconds=self.minimum_interval_seconds,
264
+ description=self.description,
265
+ metadata=metadata if metadata is not None else self._metadata,
266
+ emit_backfills=self._emit_backfills,
267
+ use_user_code_server=self._use_user_code_server,
268
+ default_condition=self._default_condition,
269
+ )
@@ -1,10 +1,10 @@
1
+ import json
1
2
  from abc import ABC, abstractmethod
2
3
  from collections.abc import Callable, Mapping, Sequence
3
4
  from datetime import datetime
4
5
  from os import PathLike
5
6
  from typing import Any, Generic, Optional, Union
6
7
 
7
- import dagster_shared.seven as seven
8
8
  from dagster_shared.record import IHaveNew, LegacyNamedTupleMixin, record, record_custom
9
9
  from dagster_shared.serdes.serdes import (
10
10
  FieldSerializer,
@@ -668,8 +668,9 @@ class JsonMetadataValue(
668
668
 
669
669
  def __new__(cls, data: Optional[Union[Sequence[Any], Mapping[str, Any]]]):
670
670
  try:
671
- # check that the value is JSON serializable
672
- seven.dumps(data)
671
+ # check that the value is JSON serializable (and do any transformation
672
+ # that json.dumps would do under the hood, like enums to string values)
673
+ data = json.loads(json.dumps(data))
673
674
  except TypeError:
674
675
  raise DagsterInvalidMetadata("Value is not JSON serializable.")
675
676
  return super().__new__(cls, data=data)
@@ -22,6 +22,7 @@ from dagster._core.definitions.sensor_definition import (
22
22
  SensorType,
23
23
  get_context_param_name,
24
24
  get_sensor_context_from_args_or_kwargs,
25
+ resolve_jobs_from_targets_for_with_attributes,
25
26
  validate_and_get_resource_dict,
26
27
  )
27
28
  from dagster._core.definitions.target import ExecutableDefinition
@@ -33,7 +34,7 @@ from dagster._core.errors import (
33
34
  )
34
35
  from dagster._core.instance import DagsterInstance
35
36
  from dagster._core.instance.ref import InstanceRef
36
- from dagster._utils import normalize_to_repository
37
+ from dagster._utils import IHasInternalInit, normalize_to_repository
37
38
  from dagster._utils.warnings import deprecation_warning, normalize_renamed_param
38
39
 
39
40
  if TYPE_CHECKING:
@@ -1103,7 +1104,7 @@ MultiAssetMaterializationFunction = Callable[
1103
1104
  "multi_asset_sensors may be used."
1104
1105
  )
1105
1106
  @public
1106
- class MultiAssetSensorDefinition(SensorDefinition):
1107
+ class MultiAssetSensorDefinition(SensorDefinition, IHasInternalInit):
1107
1108
  """Define an asset sensor that initiates a set of runs based on the materialization of a list of
1108
1109
  assets.
1109
1110
 
@@ -1245,6 +1246,9 @@ class MultiAssetSensorDefinition(SensorDefinition):
1245
1246
  return _fn
1246
1247
 
1247
1248
  self._raw_asset_materialization_fn = asset_materialization_fn
1249
+ self._monitored_assets = monitored_assets
1250
+ self._job_name = job_name
1251
+ self._raw_required_resource_keys = combined_required_resource_keys
1248
1252
 
1249
1253
  super().__init__(
1250
1254
  name=check_valid_name(name),
@@ -1288,3 +1292,61 @@ class MultiAssetSensorDefinition(SensorDefinition):
1288
1292
  @property
1289
1293
  def sensor_type(self) -> SensorType:
1290
1294
  return SensorType.MULTI_ASSET
1295
+
1296
+ @staticmethod
1297
+ def dagster_internal_init( # type: ignore
1298
+ *,
1299
+ name: str,
1300
+ monitored_assets: Union[Sequence[AssetKey], AssetSelection],
1301
+ job_name: Optional[str],
1302
+ asset_materialization_fn: MultiAssetMaterializationFunction,
1303
+ minimum_interval_seconds: Optional[int],
1304
+ description: Optional[str],
1305
+ job: Optional[ExecutableDefinition],
1306
+ jobs: Optional[Sequence[ExecutableDefinition]],
1307
+ default_status: DefaultSensorStatus,
1308
+ request_assets: Optional[AssetSelection],
1309
+ required_resource_keys: Optional[set[str]],
1310
+ tags: Optional[Mapping[str, str]],
1311
+ metadata: Optional[RawMetadataMapping],
1312
+ ) -> "MultiAssetSensorDefinition":
1313
+ return MultiAssetSensorDefinition(
1314
+ name=name,
1315
+ monitored_assets=monitored_assets,
1316
+ job_name=job_name,
1317
+ asset_materialization_fn=asset_materialization_fn,
1318
+ minimum_interval_seconds=minimum_interval_seconds,
1319
+ description=description,
1320
+ job=job,
1321
+ jobs=jobs,
1322
+ default_status=default_status,
1323
+ request_assets=request_assets,
1324
+ required_resource_keys=required_resource_keys,
1325
+ tags=tags,
1326
+ metadata=metadata,
1327
+ )
1328
+
1329
+ def with_attributes(
1330
+ self,
1331
+ *,
1332
+ jobs: Optional[Sequence[ExecutableDefinition]] = None,
1333
+ metadata: Optional[RawMetadataMapping] = None,
1334
+ ) -> "MultiAssetSensorDefinition":
1335
+ """Returns a copy of this sensor with the attributes replaced."""
1336
+ job_name, new_job, new_jobs = resolve_jobs_from_targets_for_with_attributes(self, jobs)
1337
+
1338
+ return MultiAssetSensorDefinition.dagster_internal_init(
1339
+ name=self.name,
1340
+ monitored_assets=self._monitored_assets,
1341
+ job_name=job_name,
1342
+ asset_materialization_fn=self._raw_asset_materialization_fn,
1343
+ minimum_interval_seconds=self.minimum_interval_seconds,
1344
+ description=self.description,
1345
+ job=new_job,
1346
+ jobs=new_jobs,
1347
+ default_status=self.default_status,
1348
+ request_assets=self.asset_selection,
1349
+ required_resource_keys=self._raw_required_resource_keys,
1350
+ tags=self._tags,
1351
+ metadata=metadata if metadata is not None else self._metadata,
1352
+ )
@@ -1,4 +1,5 @@
1
1
  import inspect
2
+ import re
2
3
  from collections.abc import Iterator, Mapping, Sequence, Set
3
4
  from typing import ( # noqa: UP035
4
5
  TYPE_CHECKING,
@@ -36,7 +37,7 @@ from dagster._core.definitions.resource_requirement import (
36
37
  ResourceRequirement,
37
38
  )
38
39
  from dagster._core.definitions.result import MaterializeResult, ObserveResult
39
- from dagster._core.definitions.utils import DEFAULT_IO_MANAGER_KEY, check_valid_chars
40
+ from dagster._core.definitions.utils import DEFAULT_IO_MANAGER_KEY
40
41
  from dagster._core.errors import (
41
42
  DagsterInvalidDefinitionError,
42
43
  DagsterInvalidInvocationError,
@@ -611,12 +612,19 @@ def _is_result_object_type(ttype):
611
612
  return ttype in (MaterializeResult, ObserveResult, AssetCheckResult)
612
613
 
613
614
 
615
+ VALID_POOL_NAME_REGEX_STR = r"^[A-Za-z0-9_\/]+$" # standard name regex with slashes
616
+ VALID_POOL_NAME_REGEX = re.compile(VALID_POOL_NAME_REGEX_STR)
617
+
618
+
614
619
  def _validate_pool(pool, tags):
615
620
  check.opt_str_param(pool, "pool")
616
621
  if not pool:
617
622
  return None
618
623
 
619
- check_valid_chars(pool)
624
+ if not VALID_POOL_NAME_REGEX.match(pool):
625
+ raise DagsterInvalidDefinitionError(
626
+ f'Pool "{pool}" is not a valid pool name. It must match the regex {VALID_POOL_NAME_REGEX_STR}.'
627
+ )
620
628
 
621
629
  tags = check.opt_mapping_param(tags, "tags")
622
630
  tag_concurrency_key = tags.get(GLOBAL_CONCURRENCY_TAG)
@@ -154,9 +154,6 @@ class ReconstructableRepository(
154
154
  container_context=self.container_context,
155
155
  )
156
156
 
157
- def get_python_origin_id(self) -> str:
158
- return self.get_python_origin().get_id()
159
-
160
157
  # Allow this to be hashed for use in `lru_cache`. This is needed because:
161
158
  # - `ReconstructableJob` uses `lru_cache`
162
159
  # - `ReconstructableJob` has a `ReconstructableRepository` attribute
@@ -313,9 +310,6 @@ class ReconstructableJob( # pyright: ignore[reportIncompatibleVariableOverride]
313
310
  def get_python_origin(self) -> JobPythonOrigin:
314
311
  return JobPythonOrigin(self.job_name, self.repository.get_python_origin())
315
312
 
316
- def get_python_origin_id(self) -> str:
317
- return self.get_python_origin().get_id()
318
-
319
313
  def get_module(self) -> Optional[str]:
320
314
  """Return the module the job is found in, the origin is a module code pointer."""
321
315
  pointer = self.get_python_origin().get_repo_pointer()
@@ -30,6 +30,7 @@ from dagster._core.definitions.sensor_definition import (
30
30
  SkipReason,
31
31
  get_context_param_name,
32
32
  get_or_create_sensor_context,
33
+ resolve_jobs_from_targets_for_with_attributes,
33
34
  validate_and_get_resource_dict,
34
35
  )
35
36
  from dagster._core.definitions.target import ExecutableDefinition
@@ -46,6 +47,7 @@ from dagster._core.instance import DagsterInstance
46
47
  from dagster._core.storage.dagster_run import DagsterRun, DagsterRunStatus, RunsFilter
47
48
  from dagster._serdes import serialize_value, whitelist_for_serdes
48
49
  from dagster._time import datetime_from_timestamp, parse_time_string
50
+ from dagster._utils import IHasInternalInit
49
51
  from dagster._utils.error import serializable_error_info_from_exc_info
50
52
  from dagster._utils.warnings import normalize_renamed_param
51
53
 
@@ -583,7 +585,7 @@ def run_failure_sensor(
583
585
 
584
586
 
585
587
  @public
586
- class RunStatusSensorDefinition(SensorDefinition):
588
+ class RunStatusSensorDefinition(SensorDefinition, IHasInternalInit):
587
589
  """Define a sensor that reacts to a given status of job execution, where the decorated
588
590
  function will be evaluated when a run is at the given status.
589
591
 
@@ -685,6 +687,10 @@ class RunStatusSensorDefinition(SensorDefinition):
685
687
  self._run_status_sensor_fn = check.callable_param(
686
688
  run_status_sensor_fn, "run_status_sensor_fn"
687
689
  )
690
+ self._run_status = run_status
691
+ self._monitored_jobs = monitored_jobs
692
+ self._monitor_all_code_locations = monitor_all_code_locations
693
+ self._raw_required_resource_keys = combined_required_resource_keys
688
694
  event_type = PIPELINE_RUN_STATUS_TO_EVENT_TYPE[run_status]
689
695
 
690
696
  # split monitored_jobs into external repos, external jobs, and jobs in the current repo
@@ -1024,6 +1030,78 @@ class RunStatusSensorDefinition(SensorDefinition):
1024
1030
  def sensor_type(self) -> SensorType:
1025
1031
  return SensorType.RUN_STATUS
1026
1032
 
1033
+ @staticmethod
1034
+ def dagster_internal_init( # type: ignore
1035
+ *,
1036
+ name: str,
1037
+ run_status: DagsterRunStatus,
1038
+ run_status_sensor_fn: RunStatusSensorEvaluationFunction,
1039
+ minimum_interval_seconds: Optional[int],
1040
+ description: Optional[str],
1041
+ monitored_jobs: Optional[
1042
+ Sequence[
1043
+ Union[
1044
+ JobDefinition,
1045
+ GraphDefinition,
1046
+ UnresolvedAssetJobDefinition,
1047
+ "RepositorySelector",
1048
+ "JobSelector",
1049
+ "CodeLocationSelector",
1050
+ ]
1051
+ ]
1052
+ ],
1053
+ monitor_all_code_locations: Optional[bool],
1054
+ default_status: DefaultSensorStatus,
1055
+ request_job: Optional[ExecutableDefinition],
1056
+ request_jobs: Optional[Sequence[ExecutableDefinition]],
1057
+ tags: Optional[Mapping[str, str]],
1058
+ metadata: Optional[RawMetadataMapping],
1059
+ required_resource_keys: Optional[set[str]],
1060
+ ) -> "RunStatusSensorDefinition":
1061
+ return RunStatusSensorDefinition(
1062
+ name=name,
1063
+ run_status=run_status,
1064
+ run_status_sensor_fn=run_status_sensor_fn,
1065
+ minimum_interval_seconds=minimum_interval_seconds,
1066
+ description=description,
1067
+ monitored_jobs=monitored_jobs,
1068
+ monitor_all_code_locations=monitor_all_code_locations,
1069
+ default_status=default_status,
1070
+ request_job=request_job,
1071
+ request_jobs=request_jobs,
1072
+ tags=tags,
1073
+ metadata=metadata,
1074
+ required_resource_keys=required_resource_keys,
1075
+ )
1076
+
1077
+ def with_attributes(
1078
+ self,
1079
+ *,
1080
+ jobs: Optional[Sequence[ExecutableDefinition]] = None,
1081
+ metadata: Optional[RawMetadataMapping] = None,
1082
+ ) -> "RunStatusSensorDefinition":
1083
+ """Returns a copy of this sensor with the attributes replaced."""
1084
+ job_name, new_job, new_jobs = resolve_jobs_from_targets_for_with_attributes(self, jobs)
1085
+
1086
+ # We need to store the run_status and monitored_jobs for reconstruction
1087
+ # Extract monitored_jobs from the wrapped function's closure if possible
1088
+ # For now, we'll need to access the stored attributes
1089
+ return RunStatusSensorDefinition.dagster_internal_init(
1090
+ name=self.name,
1091
+ run_status=self._run_status,
1092
+ run_status_sensor_fn=self._run_status_sensor_fn,
1093
+ minimum_interval_seconds=self.minimum_interval_seconds,
1094
+ description=self.description,
1095
+ monitored_jobs=self._monitored_jobs,
1096
+ monitor_all_code_locations=self._monitor_all_code_locations,
1097
+ default_status=self.default_status,
1098
+ request_job=new_job,
1099
+ request_jobs=new_jobs,
1100
+ tags=self._tags,
1101
+ metadata=metadata if metadata is not None else self._metadata,
1102
+ required_resource_keys=self._raw_required_resource_keys,
1103
+ )
1104
+
1027
1105
 
1028
1106
  @deprecated_param(
1029
1107
  param="job_selection",
@@ -554,6 +554,37 @@ def split_run_requests(
554
554
  return run_requests_for_backfill_daemon, run_requests_for_single_runs
555
555
 
556
556
 
557
+ def resolve_jobs_from_targets_for_with_attributes(
558
+ sensor_def: "SensorDefinition", new_jobs: Optional[Sequence[ExecutableDefinition]]
559
+ ) -> tuple[Optional[str], Optional[ExecutableDefinition], Optional[Sequence[ExecutableDefinition]]]:
560
+ """Utility function to resolve job/jobs/job_name parameters for with_attributes method.
561
+
562
+ Returns a tuple of (job_name, job, jobs) to pass to dagster_internal_init.
563
+ """
564
+ if new_jobs is not None:
565
+ new_jobs_seq = new_jobs if len(new_jobs) > 1 else None
566
+ new_job = new_jobs[0] if len(new_jobs) == 1 else None
567
+ job_name = None
568
+ elif sensor_def.has_jobs:
569
+ new_job = sensor_def.job if len(sensor_def.jobs) == 1 else None
570
+ new_jobs_seq = sensor_def.jobs if len(sensor_def.jobs) > 1 else None
571
+ job_name = None
572
+ elif sensor_def._targets: # noqa: SLF001
573
+ check.invariant(
574
+ len(sensor_def._targets) == 1 and not sensor_def._targets[0].has_job_def, # noqa: SLF001
575
+ "Expected only one target by job name string.",
576
+ )
577
+ job_name = sensor_def._targets[0].job_name # noqa: SLF001
578
+ new_job = None
579
+ new_jobs_seq = None
580
+ else:
581
+ job_name = None
582
+ new_job = None
583
+ new_jobs_seq = None
584
+
585
+ return job_name, new_job, new_jobs_seq
586
+
587
+
557
588
  @public
558
589
  @beta_param(param="owners")
559
590
  class SensorDefinition(IHasInternalInit):
@@ -597,27 +628,7 @@ class SensorDefinition(IHasInternalInit):
597
628
  metadata: Optional[RawMetadataMapping] = None,
598
629
  ) -> "SensorDefinition":
599
630
  """Returns a copy of this sensor with the attributes replaced."""
600
- # unfortunate re-derivation of how inputs map to _targets
601
- if jobs is not None:
602
- new_jobs = jobs if len(jobs) > 1 else None
603
- new_job = jobs[0] if len(jobs) == 1 else None
604
- job_name = None
605
- elif self.has_jobs:
606
- new_job = self.job if len(self.jobs) == 1 else None
607
- new_jobs = self.jobs if len(self.jobs) > 1 else None
608
- job_name = None
609
- elif self._targets:
610
- check.invariant(
611
- len(self._targets) == 1 and not self._targets[0].has_job_def,
612
- "Expected only one target by job name string.",
613
- )
614
- job_name = self._targets[0].job_name
615
- new_job = None
616
- new_jobs = None
617
- else:
618
- job_name = None
619
- new_job = None
620
- new_jobs = None
631
+ job_name, new_job, new_jobs = resolve_jobs_from_targets_for_with_attributes(self, jobs)
621
632
 
622
633
  return SensorDefinition.dagster_internal_init(
623
634
  name=self.name,
@@ -128,7 +128,9 @@ class StepFailureData(
128
128
  "User code error is missing cause. User code errors are expected to have a"
129
129
  " causes, which are the errors thrown from user code.",
130
130
  )
131
- return self.error.message.strip() + ":\n\n" + user_code_error.to_string()
131
+ return (
132
+ self.error.message.strip() + ":\n\n" + check.not_none(user_code_error).to_string()
133
+ )
132
134
  else:
133
135
  return self.error.to_string()
134
136
 
@@ -18,11 +18,7 @@ from dagster._core.definitions.reconstruct import ReconstructableJob, Reconstruc
18
18
  from dagster._core.definitions.repository_definition import RepositoryDefinition
19
19
  from dagster._core.definitions.selector import JobSubsetSelector
20
20
  from dagster._core.definitions.timestamp import TimestampWithTimezone
21
- from dagster._core.errors import (
22
- DagsterInvalidSubsetError,
23
- DagsterInvariantViolationError,
24
- DagsterUserCodeProcessError,
25
- )
21
+ from dagster._core.errors import DagsterInvalidSubsetError, DagsterUserCodeProcessError
26
22
  from dagster._core.execution.api import create_execution_plan
27
23
  from dagster._core.execution.plan.state import KnownExecutionState
28
24
  from dagster._core.instance import DagsterInstance
@@ -318,14 +314,16 @@ class CodeLocation(AbstractContextManager):
318
314
 
319
315
  @property
320
316
  @abstractmethod
321
- def repository_code_pointer_dict(self) -> Mapping[str, CodePointer]:
317
+ def repository_code_pointer_dict(self) -> Mapping[str, Optional[CodePointer]]:
322
318
  pass
323
319
 
324
- def get_repository_python_origin(self, repository_name: str) -> "RepositoryPythonOrigin":
325
- if repository_name not in self.repository_code_pointer_dict:
326
- raise DagsterInvariantViolationError(f"Unable to find repository {repository_name}.")
320
+ def get_repository_python_origin(
321
+ self, repository_name: str
322
+ ) -> Optional["RepositoryPythonOrigin"]:
323
+ code_pointer = self.repository_code_pointer_dict.get(repository_name)
324
+ if not code_pointer:
325
+ return None
327
326
 
328
- code_pointer = self.repository_code_pointer_dict[repository_name]
329
327
  return RepositoryPythonOrigin(
330
328
  executable_path=self.executable_path or sys.executable,
331
329
  code_pointer=code_pointer,
@@ -414,7 +412,7 @@ class InProcessCodeLocation(CodeLocation):
414
412
  return self._origin.entry_point
415
413
 
416
414
  @property
417
- def repository_code_pointer_dict(self) -> Mapping[str, CodePointer]:
415
+ def repository_code_pointer_dict(self) -> Mapping[str, Optional[CodePointer]]:
418
416
  return self._repository_code_pointer_dict
419
417
 
420
418
  def _get_reconstructable_repository(self, repository_name: str) -> ReconstructableRepository:
@@ -801,8 +799,8 @@ class GrpcServerCodeLocation(CodeLocation):
801
799
  return self._container_context
802
800
 
803
801
  @property
804
- def repository_code_pointer_dict(self) -> Mapping[str, CodePointer]:
805
- return cast("Mapping[str, CodePointer]", self._repository_code_pointer_dict)
802
+ def repository_code_pointer_dict(self) -> Mapping[str, Optional[CodePointer]]:
803
+ return cast("Mapping[str, Optional[CodePointer]]", self._repository_code_pointer_dict)
806
804
 
807
805
  @property
808
806
  def executable_path(self) -> Optional[str]:
@@ -25,7 +25,7 @@ if TYPE_CHECKING:
25
25
  class RepositoryHandle:
26
26
  repository_name: str
27
27
  code_location_origin: CodeLocationOrigin
28
- repository_python_origin: RepositoryPythonOrigin
28
+ repository_python_origin: Optional[RepositoryPythonOrigin]
29
29
  display_metadata: Mapping[str, str]
30
30
 
31
31
  @classmethod
@@ -51,7 +51,9 @@ class RepositoryHandle:
51
51
  )
52
52
 
53
53
  def get_python_origin(self) -> RepositoryPythonOrigin:
54
- return self.repository_python_origin
54
+ return check.not_none(
55
+ self.repository_python_origin, "Repository does not have a RepositoryPythonOrigin"
56
+ )
55
57
 
56
58
  def to_selector(self) -> RepositorySelector:
57
59
  return RepositorySelector(
@@ -85,6 +85,7 @@ from dagster._core.workspace.workspace import (
85
85
  CodeLocationLoadStatus,
86
86
  CodeLocationStatusEntry,
87
87
  CurrentWorkspace,
88
+ DefinitionsSource,
88
89
  location_status_from_location_entry,
89
90
  )
90
91
  from dagster._grpc.constants import INCREASE_TIMEOUT_DAGSTER_YAML_MSG, GrpcServerCommand
@@ -1121,6 +1122,7 @@ class WorkspaceProcessContext(IWorkspaceProcessContext[WorkspaceRequestContext])
1121
1122
  ),
1122
1123
  update_timestamp=load_time,
1123
1124
  version_key=version_key,
1125
+ definitions_source=DefinitionsSource.CODE_SERVER,
1124
1126
  )
1125
1127
 
1126
1128
  def get_current_workspace(self) -> CurrentWorkspace:
@@ -18,6 +18,11 @@ class CodeLocationLoadStatus(Enum):
18
18
  LOADED = "LOADED" # Finished loading (may be an error)
19
19
 
20
20
 
21
+ class DefinitionsSource(Enum):
22
+ CODE_SERVER = "CODE_SERVER"
23
+ CONNECTION = "CONNECTION"
24
+
25
+
21
26
  @record
22
27
  class CodeLocationEntry:
23
28
  origin: Annotated[
@@ -35,6 +40,7 @@ class CodeLocationEntry:
35
40
  display_metadata: Mapping[str, str]
36
41
  update_timestamp: float
37
42
  version_key: str
43
+ definitions_source: DefinitionsSource
38
44
 
39
45
 
40
46
  @record
@@ -991,6 +991,27 @@ class AssetDaemon(DagsterDaemon):
991
991
  log_message="Automation condition daemon caught an error",
992
992
  )
993
993
 
994
+ def _add_auto_materialize_asset_evaluations_in_chunks(
995
+ self,
996
+ instance: DagsterInstance,
997
+ evaluation_id: int,
998
+ evaluations: list[AutomationConditionEvaluationWithRunIds],
999
+ logger: logging.Logger,
1000
+ print_group_name: str,
1001
+ ):
1002
+ schedule_storage = check.not_none(instance.schedule_storage)
1003
+ if schedule_storage.supports_auto_materialize_asset_evaluations:
1004
+ chunk_size = int(os.getenv("DAGSTER_ASSET_DAEMON_ASSET_EVALUATIONS_CHUNK_SIZE", "500"))
1005
+ for i in range(0, len(evaluations), chunk_size):
1006
+ chunk = evaluations[i : i + chunk_size]
1007
+ self._logger.info(
1008
+ f"Adding {len(chunk)} asset evaluations for evaluation {evaluation_id}{print_group_name}"
1009
+ )
1010
+ schedule_storage.add_auto_materialize_asset_evaluations(
1011
+ evaluation_id,
1012
+ chunk,
1013
+ )
1014
+
994
1015
  async def _evaluate_auto_materialize_tick(
995
1016
  self,
996
1017
  tick_context: AutoMaterializeLaunchContext,
@@ -1083,11 +1104,22 @@ class AssetDaemon(DagsterDaemon):
1083
1104
  evaluation.key: evaluation.with_run_ids(set()) for evaluation in evaluations
1084
1105
  }
1085
1106
 
1107
+ self._logger.info(
1108
+ "Tick produced"
1109
+ f" {len(run_requests)} run{'s' if len(run_requests) != 1 else ''} and"
1110
+ f" {len(evaluations_by_key)} asset"
1111
+ f" evaluation{'s' if len(evaluations_by_key) != 1 else ''} for evaluation ID"
1112
+ f" {evaluation_id}{print_group_name}"
1113
+ )
1114
+
1086
1115
  # Write the asset evaluations without run IDs first
1087
1116
  if schedule_storage.supports_auto_materialize_asset_evaluations:
1088
- schedule_storage.add_auto_materialize_asset_evaluations(
1117
+ self._add_auto_materialize_asset_evaluations_in_chunks(
1118
+ instance,
1089
1119
  evaluation_id,
1090
1120
  list(evaluations_by_key.values()),
1121
+ self._logger,
1122
+ print_group_name,
1091
1123
  )
1092
1124
  check_for_debug_crash(debug_crash_flags, "ASSET_EVALUATIONS_ADDED")
1093
1125
 
@@ -1097,11 +1129,7 @@ class AssetDaemon(DagsterDaemon):
1097
1129
  ]
1098
1130
 
1099
1131
  self._logger.info(
1100
- "Tick produced"
1101
- f" {len(run_requests)} run{'s' if len(run_requests) != 1 else ''} and"
1102
- f" {len(evaluations_by_key)} asset"
1103
- f" evaluation{'s' if len(evaluations_by_key) != 1 else ''} for evaluation ID"
1104
- f" {evaluation_id}{print_group_name}"
1132
+ f"Submitting {len(run_requests)} run{'s' if len(run_requests) != 1 else ''} for evaluation {evaluation_id}{print_group_name}"
1105
1133
  )
1106
1134
 
1107
1135
  # Fetch all data that requires the code server before writing the cursor, to minimize
@@ -1179,6 +1207,7 @@ class AssetDaemon(DagsterDaemon):
1179
1207
  debug_crash_flags=debug_crash_flags,
1180
1208
  remote_sensor=sensor,
1181
1209
  run_request_execution_data_cache=run_request_execution_data_cache,
1210
+ print_group_name=print_group_name,
1182
1211
  )
1183
1212
 
1184
1213
  if schedule_storage.supports_auto_materialize_asset_evaluations:
@@ -1267,6 +1296,7 @@ class AssetDaemon(DagsterDaemon):
1267
1296
  debug_crash_flags: SingleInstigatorDebugCrashFlags,
1268
1297
  remote_sensor: Optional[RemoteSensor],
1269
1298
  run_request_execution_data_cache: dict[JobSubsetSelector, RunRequestExecutionData],
1299
+ print_group_name: str,
1270
1300
  ):
1271
1301
  updated_evaluation_keys = set()
1272
1302
  check_after_runs_num = instance.get_tick_termination_check_interval()
@@ -1325,9 +1355,12 @@ class AssetDaemon(DagsterDaemon):
1325
1355
  evaluations_by_key[asset_key] for asset_key in updated_evaluation_keys
1326
1356
  ]
1327
1357
  if evaluations_to_update:
1328
- schedule_storage = check.not_none(instance.schedule_storage)
1329
- schedule_storage.add_auto_materialize_asset_evaluations(
1330
- evaluation_id, evaluations_to_update
1358
+ self._add_auto_materialize_asset_evaluations_in_chunks(
1359
+ instance,
1360
+ evaluation_id,
1361
+ evaluations_to_update,
1362
+ self._logger,
1363
+ print_group_name,
1331
1364
  )
1332
1365
 
1333
1366
  check_for_debug_crash(debug_crash_flags, "RUN_IDS_ADDED_TO_EVALUATIONS")
dagster/_utils/error.py CHANGED
@@ -177,7 +177,7 @@ def serializable_error_info_from_exc_info(
177
177
  def unwrap_user_code_error(error_info: SerializableErrorInfo) -> SerializableErrorInfo:
178
178
  """Extracts the underlying error from the passed error, if it is a DagsterUserCodeLoadError."""
179
179
  if error_info.cls_name == "DagsterUserCodeLoadError":
180
- return unwrap_user_code_error(error_info.cause)
180
+ return unwrap_user_code_error(check.not_none(error_info.cause))
181
181
  return error_info
182
182
 
183
183
 
@@ -227,11 +227,16 @@ class Component(ABC):
227
227
  pass
228
228
 
229
229
  See Also:
230
- - :py:class:`dagster.Definitions`: The object returned by ``build_defs()``
231
- - :py:class:`dagster.ComponentLoadContext`: Context provided to ``build_defs()``
232
- - :py:class:`dagster.components.resolved.base.Resolvable`: Base for configurable components
233
- - :py:class:`dagster.Model`: Recommended base class for component schemas
234
- - :py:func:`dagster.scaffold_with`: Decorator for custom scaffolding
230
+ * :py:class:`dagster.Definitions`
231
+ The object returned by ``build_defs()``
232
+ * :py:class:`dagster.ComponentLoadContext`
233
+ Context provided to ``build_defs()``
234
+ * :py:class:`dagster.components.resolved.base.Resolvable`
235
+ Base for configurable components
236
+ * :py:class:`dagster.Model`
237
+ Recommended base class for component schemas
238
+ * :py:func:`dagster.scaffold_with`
239
+ Decorator for custom scaffolding
235
240
 
236
241
  """
237
242
 
@@ -5,6 +5,7 @@ from dagster.components.testing.deprecated.utils import (
5
5
  scaffold_defs_sandbox as scaffold_defs_sandbox,
6
6
  )
7
7
  from dagster.components.testing.utils import (
8
+ DefsFolderSandbox as DefsFolderSandbox,
8
9
  copy_code_to_file as copy_code_to_file,
9
10
  create_defs_folder_sandbox as create_defs_folder_sandbox,
10
11
  get_original_module_name as get_original_module_name,
@@ -26,6 +26,7 @@ from contextlib import contextmanager
26
26
  from dataclasses import dataclass
27
27
  from typing import Any, Optional, Union
28
28
 
29
+ from dagster._annotations import public
29
30
  from dagster._core.definitions.definitions_class import Definitions
30
31
  from dagster._utils import alter_sys_path
31
32
  from dagster.components.component.component import Component
@@ -120,6 +121,7 @@ def random_importable_name(length: int = 8) -> str:
120
121
  return "sandbox_module_" + first_char + remaining
121
122
 
122
123
 
124
+ @public
123
125
  @dataclass
124
126
  class DefsFolderSandbox:
125
127
  """A sandbox for testing components.
@@ -158,6 +160,7 @@ class DefsFolderSandbox:
158
160
  with self.build_component_tree() as tree:
159
161
  yield tree.build_defs()
160
162
 
163
+ @public
161
164
  @contextmanager
162
165
  def load_component_and_build_defs(
163
166
  self, defs_path: Path
@@ -188,6 +191,7 @@ class DefsFolderSandbox:
188
191
  defs = tree.build_defs(defs_path)
189
192
  yield component, defs
190
193
 
194
+ @public
191
195
  def scaffold_component(
192
196
  self,
193
197
  component_cls: Any,
@@ -281,35 +285,32 @@ class DefsFolderSandbox:
281
285
  sys.path.remove(injected_path)
282
286
 
283
287
 
288
+ @public
284
289
  @contextmanager
285
290
  def create_defs_folder_sandbox(
286
291
  *,
287
292
  project_name: Optional[str] = None,
288
293
  ) -> Iterator[DefsFolderSandbox]:
289
294
  """Create a lightweight sandbox to scaffold and instantiate components. Useful
290
- for those authoring component types.
295
+ for those authoring custom components.
291
296
 
292
- Scaffold defs sandbox creates a temporary project that mimics the defs folder portion
293
- of a real dagster project. It then yields a DefsFolderSandbox object which can be used to
297
+ This function creates a temporary project that mimics the ``defs`` folder portion
298
+ of a real Dagster project. It then yields a :py:class:`DefsFolderSandbox` object which can be used to
294
299
  scaffold and load components.
295
300
 
296
- DefsFolderSandbox has a few properties useful for different types of tests:
301
+ :py:class:`DefsFolderSandbox` has a few properties useful for different types of tests:
297
302
 
298
- * defs_folder_path: The absolute path to the defs folder. The user can inspect and
299
- load files from scaffolded components.
300
- e.g. (defs_folder_path / "my_component" / "defs.yaml").exists()
303
+ * ``defs_folder_path``: The absolute path to the ``defs`` folder. The user can inspect and load files from scaffolded components, e.g. ``(defs_folder_path / "my_component" / "defs.yaml").exists()``
304
+ * ``project_name``: If not provided, a random name is generated.
301
305
 
302
- * project_name: If not provided, a random name is generated.
303
-
304
- Once the sandbox is created the user has the option to load all definitions using the `load`
305
- method on DefsFolderSandbox, or the `load_component_at_path` mathod.
306
+ Once the sandbox is created, you can load all definitions using the ``load`` method on :py:class:`DefsFolderSandbox`, or with the ``load_component_at_path`` method.
306
307
 
307
308
  This sandbox does not provide complete environmental isolation, but does provide some isolation guarantees
308
309
  to do its best to isolate the test from and restore the environment after the test.
309
310
 
310
- * A file structure like this is created: <<temp folder>> / src / <<project_name>> / defs
311
- * <<temp folder>> / src is placed in sys.path during the loading process
312
- * Any modules loaded during the process that descend from defs module are evicted from sys.modules on cleanup.
311
+ * A file structure like this is created: ``<<temp folder>> / src / <<project_name>> / defs``
312
+ * ``<<temp folder>> / src`` is placed in ``sys.path`` during the loading process
313
+ * Any modules loaded during the process that descend from defs module are evicted from ``sys.modules`` on cleanup.
313
314
 
314
315
  Args:
315
316
  project_name: Optional name for the project (default: random name).
@@ -321,12 +322,12 @@ def create_defs_folder_sandbox(
321
322
 
322
323
  .. code-block:: python
323
324
 
324
- with scaffold_defs_sandbox() as sandbox:
325
+ with create_defs_folder_sandbox() as sandbox:
325
326
  defs_path = sandbox.scaffold_component(component_cls=MyComponent)
326
327
  assert (defs_path / "defs.yaml").exists()
327
328
  assert (defs_path / "my_component_config_file.yaml").exists() # produced by MyComponentScaffolder
328
329
 
329
- with scaffold_defs_sandbox() as sandbox:
330
+ with create_defs_folder_sandbox() as sandbox:
330
331
  defs_path = sandbox.scaffold_component(
331
332
  component_cls=MyComponent,
332
333
  defs_yaml_contents={"type": "MyComponent", "attributes": {"asset_key": "my_asset"}},
dagster/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.12.3"
1
+ __version__ = "1.12.4"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster
3
- Version: 1.12.3
3
+ Version: 1.12.4
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
@@ -59,8 +59,8 @@ Requires-Dist: universal_pathlib; python_version < "3.12"
59
59
  Requires-Dist: universal_pathlib>=0.2.0; python_version >= "3.12"
60
60
  Requires-Dist: rich
61
61
  Requires-Dist: filelock
62
- Requires-Dist: dagster-pipes==1.12.3
63
- Requires-Dist: dagster-shared==1.12.3
62
+ Requires-Dist: dagster-pipes==1.12.4
63
+ Requires-Dist: dagster-shared==1.12.4
64
64
  Requires-Dist: antlr4-python3-runtime
65
65
  Provides-Extra: docker
66
66
  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=XbPSLe2HETXFi6X6FeVlWRaW_ieblpExrYLZ0L8ULkU,23
7
+ dagster/version.py,sha256=ECTpCDnMmYt-JTZQ4h1vRvo71Pv0brM8s8fcdkN0PoM,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
@@ -44,7 +44,7 @@ dagster/_config/field_utils.py,sha256=9PA0ln6yD63I5HBzPTWSfWnyD8okfUYWa98BsFib0g
44
44
  dagster/_config/post_process.py,sha256=YWa3GicUfY5bQ5goVWLUTvmgJySgjbCuOQPC1N4l1EE,9549
45
45
  dagster/_config/primitive_mapping.py,sha256=0YAVfLyklI8xmdeca-U4h5CGSlsiCRWaSPddh21txp8,899
46
46
  dagster/_config/snap.py,sha256=eAKWsXN0B5mZosiu0WRGzXAgFx92m8UwcKim7lG8Po4,10673
47
- dagster/_config/source.py,sha256=yT61LldMM-g5T8ObHLDQYEmarSqVcd6bg8M7LMkXvNk,3147
47
+ dagster/_config/source.py,sha256=wRrhb6OIBCNSnOQv1zUUNUKMrylA5FjvOsvJhHu9j6Y,3526
48
48
  dagster/_config/stack.py,sha256=5w0ITGNFhwGXugONa-CjcjQBvE-dDjT4FmOIjlTAaZc,3056
49
49
  dagster/_config/traversal_context.py,sha256=WMagAF-R3zF3u5XM0lqz5-Gwc4L9WUI56TFwxMZR6kk,5737
50
50
  dagster/_config/type_printer.py,sha256=VVN4pdVlFT7kpOEl8g0RiABxpa0TZ-2r9gISX0Ggpc8,4205
@@ -52,9 +52,9 @@ dagster/_config/validate.py,sha256=CZqj_hMx8fxoIAZhMaWNygFLygIckS2QJo2p6GDcm6w,1
52
52
  dagster/_config/pythonic_config/__init__.py,sha256=v7g8bWH6Og9T3iooklNakK1Qog6Bv1BTodExeF-yhu0,1388
53
53
  dagster/_config/pythonic_config/attach_other_object_to_context.py,sha256=0BVfuIHFXhkvsaLTemHPpO3wi2ocwYQGfTp_gNyrMnQ,1632
54
54
  dagster/_config/pythonic_config/config.py,sha256=92tN7cgIfAm_AbXqloj0TM_tVN4jr4OYUubpYTo0ZuM,20135
55
- dagster/_config/pythonic_config/conversion_utils.py,sha256=1WEjixrTefN7RpNW2A87aO7SnQym_izwhG247jkowYU,13481
55
+ dagster/_config/pythonic_config/conversion_utils.py,sha256=lZbTuEx9vMKkX30WHtawZuvzAp4hgpdwOWaIDUEg7vU,13542
56
56
  dagster/_config/pythonic_config/io_manager.py,sha256=BSAK5dN7Z8doMVbNNMmpC53LrEapd2zl1Dhj8zlaK0Y,10748
57
- dagster/_config/pythonic_config/resource.py,sha256=VwhzD99_wUir43Q6JZTbT8Trrvfm9k585ewrWV5Z2YY,42778
57
+ dagster/_config/pythonic_config/resource.py,sha256=5M14g3sg7NYZ7C_Q0OXCczrC2vFQupjESbLwfaqXkkY,42842
58
58
  dagster/_config/pythonic_config/type_check_utils.py,sha256=K75S_1CGFf5KFAoxDbChNlvSFkGs1ru-nh1rPpSUGRc,775
59
59
  dagster/_config/pythonic_config/typing_utils.py,sha256=DF9eFBkRaGKWVnhfiAmSHwPGji_Ti9_CK0lVEXtZI0s,9147
60
60
  dagster/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -86,15 +86,15 @@ dagster/_core/asset_graph_view/serializable_entity_subset.py,sha256=kV9InWpbXsEA
86
86
  dagster/_core/container_context/__init__.py,sha256=YxylRIFRSQ5yYetyE6C09MyDBtk19QtUsUUkJd4mRas,215
87
87
  dagster/_core/container_context/config.py,sha256=wtFTDLs1OMMqiOx4CbUEg7gP7XPzDdAB-P-7dp64PG0,1301
88
88
  dagster/_core/definitions/__init__.py,sha256=fzykPDhZ3mnUtmCEVQBp7di1kD5LHHj_D3bZqdNMpPo,9265
89
- dagster/_core/definitions/asset_daemon_cursor.py,sha256=FIeiQH2BtVjb4V0Pfw605yL4s8ouHxKZTJvfS_l3gmE,7743
89
+ dagster/_core/definitions/asset_daemon_cursor.py,sha256=VIux8TZECFmfgF6sCOozTFVV2_5Bze3C0vjYxt0sewg,7768
90
90
  dagster/_core/definitions/asset_key.py,sha256=39gyLd_7BR7Clr9vbD9ZkiohShn-p6mkkrMld2D0NTM,9822
91
91
  dagster/_core/definitions/asset_selection.py,sha256=rQQfETcwhm8e16-tjdMSVfy2WLepVsUS0F3EVyQs0nY,51306
92
- dagster/_core/definitions/asset_sensor_definition.py,sha256=AzXFbahA3vuUSk5U5o-DzlM3QHNm0D8-2S9guTQdeB4,7937
92
+ dagster/_core/definitions/asset_sensor_definition.py,sha256=SN3iWp2G5ASosZ6jLHoezkr4gaAqpy7CRVn_nuHT7k4,10356
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
96
  dagster/_core/definitions/auto_materialize_rule_impls.py,sha256=b-Lk9OsgMhd2VpRrIYNDa-rZ85pI1u0y1b7hgUqog48,51872
97
- dagster/_core/definitions/automation_condition_sensor_definition.py,sha256=LGDX7HI3jjipb0TljLig9_QyFnG4AE9xQZDQxlZFPQk,9197
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
100
100
  dagster/_core/definitions/composition.py,sha256=ZQTX3YW7sLMCs9NbBywvglWexjCkNsarpMob55qIgKg,41500
@@ -125,17 +125,17 @@ dagster/_core/definitions/job_definition.py,sha256=27n29A9RJHjxlf0bqJwnrpXr4o6CW
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
128
- dagster/_core/definitions/multi_asset_sensor_definition.py,sha256=fnktEgtV28denxIdBVa1ch84OGaxYMWBCWi5xRY6Vdc,60248
128
+ dagster/_core/definitions/multi_asset_sensor_definition.py,sha256=dI6RmRaxEuVaqkl4mVUfdjWjCzJrimvmDQ9mew1M21M,62855
129
129
  dagster/_core/definitions/no_step_launcher.py,sha256=PXIbsPOV9F49dGWAl-ZYlz6w8PFs-ZesNsQpi8llGqk,197
130
130
  dagster/_core/definitions/node_container.py,sha256=wKTwRd-svjhNnESn8t2o7G0WykZya2-RaTobw2WM3LA,12007
131
131
  dagster/_core/definitions/node_definition.py,sha256=R4cE1bGfhxv-jzQ26Oirqdd_gOj200ymbqNB7zipe2o,8729
132
132
  dagster/_core/definitions/observe.py,sha256=kDFlEhTxxmbXRImaJFxbyM_aCDp5EQkG-hZLdNnTwO4,3000
133
- dagster/_core/definitions/op_definition.py,sha256=d3RVDAFAILeNIkaV3q621nh7RNqrZmr2J538lzn9xwo,24580
133
+ dagster/_core/definitions/op_definition.py,sha256=B5tzxRqM0n81ZN4v-toAO_P8536ltcp7Zy_DY6BBZ1k,24901
134
134
  dagster/_core/definitions/op_invocation.py,sha256=5YdGsAo8tfhCYXeatPzvgZ-Uo6h05Yr1p_C3BjNv0iI,23494
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=hMb8rTf7CesiwoasAfqusLnnEqFc3JS-4rB_Ct-wMyI,32063
138
+ dagster/_core/definitions/reconstruct.py,sha256=hz2otYlYG0FJOIejxuU9obyvHRxXOX_GY6rxa5LLQMY,31877
139
139
  dagster/_core/definitions/resolved_asset_deps.py,sha256=4SeCft35KJHeoblnoSOW_XocS23iE_0fCWg7aHXBltI,9321
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
@@ -145,11 +145,11 @@ dagster/_core/definitions/result.py,sha256=wqUoc8V0JWkNKLUq35AhwpsHNojP4qUXyccrm
145
145
  dagster/_core/definitions/run_config.py,sha256=ybNO2dDoh7OE7qeOSoQ5bGeVBDgBY5upXrazCONAfdU,24480
146
146
  dagster/_core/definitions/run_config_schema.py,sha256=g7fdXwYu9RKEMglB0j4M1uPj6n8XW3tKOwaOPz7wGHs,1521
147
147
  dagster/_core/definitions/run_request.py,sha256=h2H4z2yFrwYQQtCsP0RB4frh_aJ0SD_700N-Iu5pT-s,16425
148
- dagster/_core/definitions/run_status_sensor_definition.py,sha256=hHaCmMP_npL6eANPIu4L2U6XWeCwazSNsyHiAaNgDSA,50448
148
+ dagster/_core/definitions/run_status_sensor_definition.py,sha256=ylVwNMgFW7VG8dNPUH0i99D-FeOMYmnBdwbJfWXiQZA,53767
149
149
  dagster/_core/definitions/schedule_definition.py,sha256=w9KxAbilnp6OXz1pscbknDHikTUIzDxY6Gd94NOhw6k,45312
150
150
  dagster/_core/definitions/scoped_resources_builder.py,sha256=PDE3ADpVKr4LzeLyya-2u7AyzjeK7IBzf-6lD5fYVSs,5149
151
151
  dagster/_core/definitions/selector.py,sha256=9xNpEfwCAJPS4Qmz1AS4Z9EVqsVnhkSeI9m7x_OL_zo,12961
152
- dagster/_core/definitions/sensor_definition.py,sha256=41umSF-CXyHuIUxnkfvN22D0lQNPI5JxZRZUUDCrdzk,61910
152
+ dagster/_core/definitions/sensor_definition.py,sha256=3Vlsqb3XCvs6Zjm126NKoZSKttSsdjyWL4tb474IfQo,62463
153
153
  dagster/_core/definitions/source_asset.py,sha256=5B3phODyhGiyVv2nshkCprCgPR6MmfclEDu3yW95pJw,22718
154
154
  dagster/_core/definitions/step_launcher.py,sha256=ZNxb18qRMG0HNVExYwrSvx4pma1uzq9Hj2AKZv7l3DQ,2855
155
155
  dagster/_core/definitions/target.py,sha256=JfxKVzeXUWDFEiiyp1UiAPALRv3uVPbRxWuk3Yci_k4,5751
@@ -242,7 +242,7 @@ dagster/_core/definitions/decorators/source_asset_decorator.py,sha256=KE9oCVlzaR
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
244
  dagster/_core/definitions/metadata/metadata_set.py,sha256=8npbUlJwSg0pXrvAM7xP213Ii0y3ySNmsru470_SU98,7664
245
- dagster/_core/definitions/metadata/metadata_value.py,sha256=A53q_fz8gfFy7j7FQqJRwGDm1H5_NzBnJZhhbDROXN0,33290
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
248
248
  dagster/_core/definitions/module_loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -357,7 +357,7 @@ dagster/_core/execution/plan/handle.py,sha256=1716C0GK5bsSupHReaYxbAxrUf-zc9cDka
357
357
  dagster/_core/execution/plan/inputs.py,sha256=PzD0qqEtvyw9OQMXVPtHf3QWu4ZYU0AtXKaWgtHnPSw,30542
358
358
  dagster/_core/execution/plan/instance_concurrency_context.py,sha256=8xbNUHN3jfggeWPnmLVZ2mR9OH4vSI-SxT2rwDlbRVA,7161
359
359
  dagster/_core/execution/plan/local_external_step_main.py,sha256=M185NvpCEiC38yt6SRYMqZmaZu157IUcG_PirzzzNcE,1191
360
- dagster/_core/execution/plan/objects.py,sha256=8quUNm6x_7O3lqoXHfyoKiw-G5ie-SHxhr38UC6idi8,5788
360
+ dagster/_core/execution/plan/objects.py,sha256=bMFauRqKwOtg05_-_qGhS0TlvEFefZQXOx1-GKHL2HU,5836
361
361
  dagster/_core/execution/plan/outputs.py,sha256=kjNheUhNRRnJL_4zkOowaeKAddTQ19URxghkREbVsZk,7632
362
362
  dagster/_core/execution/plan/plan.py,sha256=urPcPsBWHJxs6RmteAqyO2vh8InBaeSoaTPCpMVT-qA,56778
363
363
  dagster/_core/execution/plan/resume_retry.py,sha256=Ea8FgqWGFI7kI1WFEuPmgq9vfp9ppkGOXZJhgPPYVNw,160
@@ -408,13 +408,13 @@ dagster/_core/pipes/merge_streams.py,sha256=fOagYT2-ILjoO_WcPpqiXDGCsLbkiLZXUjjx
408
408
  dagster/_core/pipes/subprocess.py,sha256=IzrKVG39YOzu6D0C2GHjJzsNFQgQH9X51RbkGDZAQGQ,6238
409
409
  dagster/_core/pipes/utils.py,sha256=LworRlg5CL-EJvAYYwgIux1r-e8DknxXJeKV-O5rMu0,33656
410
410
  dagster/_core/remote_representation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
- dagster/_core/remote_representation/code_location.py,sha256=kJ8o65kx007hf4SIhMJe9aofiuMgP8crEfbbOb6iRyI,43129
411
+ dagster/_core/remote_representation/code_location.py,sha256=espz1rAuPpHMb7VcRbDF-9q15b9bVDsp7f06oQI7jH4,43034
412
412
  dagster/_core/remote_representation/external.py,sha256=5KBxAxSWlEGkTNeABdYxG172DfvXtDLH904pxIX81js,45098
413
413
  dagster/_core/remote_representation/external_data.py,sha256=z1OXOvE0OGLtpRfiTkL_c7oo0dwAeYY_XayGDEfRDnQ,67672
414
414
  dagster/_core/remote_representation/feature_flags.py,sha256=_yd6o_4X79OyLCeA2bBR8lUsHZliJEkym57ld3aCW1g,1477
415
415
  dagster/_core/remote_representation/grpc_server_registry.py,sha256=XLig5YVETxBykKQcOXAKZmCBTL3tKq-nvzBR7OeOluE,12048
416
416
  dagster/_core/remote_representation/grpc_server_state_subscriber.py,sha256=YaQOXlTScEv-YAz99Bf4FWkp85TO5W6L7TdEs87M2j4,1485
417
- dagster/_core/remote_representation/handle.py,sha256=X-rhevgN5XH1la5pDyKK0UlqGOG2CcNga60zn3BBO5s,5661
417
+ dagster/_core/remote_representation/handle.py,sha256=YO7Kan9wppbX3NnvuB0xkqNhqAalVd2g8KXFS4lrum8,5762
418
418
  dagster/_core/remote_representation/historical.py,sha256=RbMRpWVwQUpM7dTVwk83OS2nyxZcJeKMA9qhc2WhLEM,1836
419
419
  dagster/_core/remote_representation/job_index.py,sha256=5-km178Fpm0b0WNoFIM3wndgz-7J-XTaK_jG9QWipJs,4391
420
420
  dagster/_core/remote_representation/represented.py,sha256=exlAFG3jkmhHyEleXAsZW83ac2-xTPbTUi6flOKUhVk,3879
@@ -614,14 +614,14 @@ dagster/_core/types/transform_typing.py,sha256=sRsaoDC2zJlVQk9Gn5Ra2so58dOA2xOGd
614
614
  dagster/_core/workspace/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
615
615
  dagster/_core/workspace/autodiscovery.py,sha256=GbzLD8RsGd4P5XFK-kP_cLkRKp2GQokjKMknw04CUD8,5309
616
616
  dagster/_core/workspace/config_schema.py,sha256=0doh9IepHQy-qBQmnTB18S7op3E-HQQdY3NbD4u9J6A,3989
617
- dagster/_core/workspace/context.py,sha256=SI6eM6t1qDXjepHhNZ1WoAIeY_yPelhqp7JrIQrc9Mg,49044
617
+ dagster/_core/workspace/context.py,sha256=5n6bAL5KFLVG69lZR3RarGaIf2y7Vbs03OxiIhbwl4A,49129
618
618
  dagster/_core/workspace/load.py,sha256=NCH-JthAXwYi4XVW5kXs9oISKNeBHGqdSAstzFHsIPM,13652
619
619
  dagster/_core/workspace/load_target.py,sha256=48w49s13kXEEJ_sMYhEhmvyCTXckLoGV_njfzY8ADZM,9497
620
620
  dagster/_core/workspace/permissions.py,sha256=tUD3PYIs5aZoV9IiR8oD2tmeq8ptM4BjNnTaXPVGqx0,4361
621
- dagster/_core/workspace/workspace.py,sha256=Wmr984ximqr7fKOPiJGN8hTWKEKEtT49TLrkd6VbOGY,2401
621
+ dagster/_core/workspace/workspace.py,sha256=m26z1PlJrVd3Y_5o6I1R7rwkMRQ62_AAxskx_crnfoA,2538
622
622
  dagster/_daemon/__init__.py,sha256=2X3MJ45zmvO8LqfdFYN1zoQcvMw4WCc0pPJg50o8EAE,2106
623
623
  dagster/_daemon/__main__.py,sha256=tNNSaUs_mo4vndbdpUMxpBWU8Fy21sqLOuXUM1zpmY0,45
624
- dagster/_daemon/asset_daemon.py,sha256=MOOUQUo09B1Ccza3O5PGiAjyiInZSQQtoGHAU6sKDAQ,58282
624
+ dagster/_daemon/asset_daemon.py,sha256=fIsCGLmRPi7bZyTQ44FkzsIsk5XJiZdxTZwjiE5rogw,59632
625
625
  dagster/_daemon/backfill.py,sha256=TrXoAG0CinrgSARcFX11l5EYWlXrr-e3l7Fh34ZDsTQ,12612
626
626
  dagster/_daemon/controller.py,sha256=3O4C5VJYXZ_To6H3TnYpIxzlBQT58z5aDAcOqDlmbK8,19877
627
627
  dagster/_daemon/daemon.py,sha256=PqQs3sAWGyGjDhR01OqmagIWN5Xzw0nHy6MhG-xyCwg,15134
@@ -699,7 +699,7 @@ dagster/_utils/container.py,sha256=7ryY8iQMYj2-SpOUB7avtQb9zFhvnWwVtrNpKv5LTmA,1
699
699
  dagster/_utils/cronstring.py,sha256=ArDL3RX9903iOsNljgOvH7PB6NQA5jA7V6E_XIxx9fM,1587
700
700
  dagster/_utils/dagster_type.py,sha256=cf9Ee2kCacMqzeVb1bkSUBSE0GofaVgXPg4X2qp1IAE,2473
701
701
  dagster/_utils/env.py,sha256=OztL1_lBhIzYxuLC8_bTIdxBIDZoNQICSVrQINEZ8Ec,227
702
- dagster/_utils/error.py,sha256=SHTy8W_i7LPjqyLv5oVpfX4ykMR0Ef_gc7HFxnsyLXM,10777
702
+ dagster/_utils/error.py,sha256=FBe5s4QytwhSNqAnRR96kT2iAK1PP9DbNHogPb_InBc,10793
703
703
  dagster/_utils/forked_pdb.py,sha256=zIsedsYyC_RaNCIT1EhC2RMOFHSs7YB16TcU9fRJU1o,1070
704
704
  dagster/_utils/hosted_user_process.py,sha256=7pmsUFzf7d9js3K47YYZl3LxxijEp_ybjRowwc38JvY,2200
705
705
  dagster/_utils/indenting_printer.py,sha256=cG722h_d06myrN65UG4-qErJLpGUESo24wxc6RiqOug,2975
@@ -763,7 +763,7 @@ dagster/components/definitions.py,sha256=d6O3ZSXD9YJXx_03r5WFMLSIFP2fRqYktMgorm_
763
763
  dagster/components/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
764
764
  dagster/components/version.py,sha256=zJqpDCTjOK_8UUTArYG8Z1_m1MefgAGZk1YNGY1V3U0,24
765
765
  dagster/components/component/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
766
- dagster/components/component/component.py,sha256=2WJfI6WQE10HHq4gEGIVr-3lqcG99Lgych72MaAYvWk,15332
766
+ dagster/components/component/component.py,sha256=FerFC99YX0iaVIV4X_FKTGbEzRYsn2MNn1pGxEd4g18,15387
767
767
  dagster/components/component/component_loader.py,sha256=sJzc7fh6eRNHpIzDlm8KpqmmHKbF92QtZkIgPohQdM8,1802
768
768
  dagster/components/component/component_scaffolder.py,sha256=FY9juAchYcPJorsrfCAu0ieQrNkgYZvJyfLW1iOkXlI,404
769
769
  dagster/components/component/state_backed_component.py,sha256=1TjwMAk4gdQjHeeo96kpfm6g6GWM6dqt6PT5tcTZ0WQ,10715
@@ -810,9 +810,9 @@ dagster/components/resolved/model.py,sha256=-MOFSYVgZ8CvNfcw-4Q-6sS4vsxDSkIcSUGx
810
810
  dagster/components/resolved/scopes.py,sha256=uF_kpirZLKc5FNEUMyp_vci-EI1Lxv_2pe42Zkpdbj4,5451
811
811
  dagster/components/scaffold/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
812
812
  dagster/components/scaffold/scaffold.py,sha256=K6KYZNdB6E6qHG9BP8mk9TnLxJXPeD0GIZUK_mHSGTk,4339
813
- dagster/components/testing/__init__.py,sha256=tYUhKu8v5Ohic1VOIP-6U8iWMByxSFMfoCSTZ_eh_Tc,581
813
+ dagster/components/testing/__init__.py,sha256=FjDbV2QyslmxItlmVysH-TGWCTysaeR5MnBv1jvhE4A,625
814
814
  dagster/components/testing/test_cases.py,sha256=UKyv7y-3Oda8fyloqB-q3nS34uEsMFzkTmYGZNw5MZQ,6908
815
- dagster/components/testing/utils.py,sha256=v-6scnVw7YORH9d6DwLcLe0IhqfRkvBbsmW2BnJKa08,14165
815
+ dagster/components/testing/utils.py,sha256=0GgotW5EuP_0p6V12RH7cz0Rcclm2eD9kx7CxxjnEeg,14297
816
816
  dagster/components/testing/deprecated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
817
817
  dagster/components/testing/deprecated/utils.py,sha256=KvxyMlHsblHKhcwIwG18VDiDuVcDLrlW81RyeI_IaT0,12346
818
818
  dagster/components/utils/__init__.py,sha256=OEaovCFfS6Vd5hl_aFLC8aFLMmSlBEdyIy4TrJvhuQM,2626
@@ -822,9 +822,9 @@ dagster/components/utils/translation.py,sha256=gKal6ZdMbYImiBLZVa9E2pz4690j8Hukf
822
822
  dagster/deprecated/__init__.py,sha256=fkuCwd_79EmS-Voox0YlWEHWxZwQ0ZM_V0viwxw5isw,127
823
823
  dagster/preview/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
824
824
  dagster/preview/freshness/__init__.py,sha256=zq0UU-3mnxycgJDtAZ9DFWiBh4eXxKCaKbeuRmUl3_Y,276
825
- dagster-1.12.3.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
826
- dagster-1.12.3.dist-info/METADATA,sha256=2OlxMe4n6tVlgxSj82IEmmt7yHONOErf-xOi6KiuTY8,12221
827
- dagster-1.12.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
828
- dagster-1.12.3.dist-info/entry_points.txt,sha256=D4W0jf1lM8zq82j3DJd9JkZEmHdFz5gkz8ddRzOEzpc,139
829
- dagster-1.12.3.dist-info/top_level.txt,sha256=Gx3NqlMQh6AsfIZaJJXEfep5yh-e9pUxkzOlUV3s6CM,8
830
- dagster-1.12.3.dist-info/RECORD,,
825
+ dagster-1.12.4.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
826
+ dagster-1.12.4.dist-info/METADATA,sha256=7E0AUSxQ13gPTATcl_bNco3O6PPpcoAzMlsy9AZ9rs0,12221
827
+ dagster-1.12.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
828
+ dagster-1.12.4.dist-info/entry_points.txt,sha256=D4W0jf1lM8zq82j3DJd9JkZEmHdFz5gkz8ddRzOEzpc,139
829
+ dagster-1.12.4.dist-info/top_level.txt,sha256=Gx3NqlMQh6AsfIZaJJXEfep5yh-e9pUxkzOlUV3s6CM,8
830
+ dagster-1.12.4.dist-info/RECORD,,