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.
- dagster/_config/pythonic_config/conversion_utils.py +2 -1
- dagster/_config/pythonic_config/resource.py +4 -2
- dagster/_config/source.py +17 -6
- dagster/_core/definitions/asset_daemon_cursor.py +4 -3
- dagster/_core/definitions/asset_sensor_definition.py +61 -1
- dagster/_core/definitions/automation_condition_sensor_definition.py +59 -2
- dagster/_core/definitions/metadata/metadata_value.py +4 -3
- dagster/_core/definitions/multi_asset_sensor_definition.py +64 -2
- dagster/_core/definitions/op_definition.py +10 -2
- dagster/_core/definitions/reconstruct.py +0 -6
- dagster/_core/definitions/run_status_sensor_definition.py +79 -1
- dagster/_core/definitions/sensor_definition.py +32 -21
- dagster/_core/execution/plan/objects.py +3 -1
- dagster/_core/remote_representation/code_location.py +11 -13
- dagster/_core/remote_representation/handle.py +4 -2
- dagster/_core/workspace/context.py +2 -0
- dagster/_core/workspace/workspace.py +6 -0
- dagster/_daemon/asset_daemon.py +42 -9
- dagster/_utils/error.py +1 -1
- dagster/components/component/component.py +10 -5
- dagster/components/testing/__init__.py +1 -0
- dagster/components/testing/utils.py +17 -16
- dagster/version.py +1 -1
- {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/METADATA +3 -3
- {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/RECORD +29 -29
- {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/WHEEL +0 -0
- {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/entry_points.txt +0 -0
- {dagster-1.12.3.dist-info → dagster-1.12.4.dist-info}/licenses/LICENSE +0 -0
- {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,
|
|
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,
|
|
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
|
|
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
|
|
68
|
-
)
|
|
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
|
|
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
|
|
95
|
-
)
|
|
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
|
-
) ->
|
|
57
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
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
|
dagster/_daemon/asset_daemon.py
CHANGED
|
@@ -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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
1329
|
-
|
|
1330
|
-
evaluation_id,
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
295
|
+
for those authoring custom components.
|
|
291
296
|
|
|
292
|
-
|
|
293
|
-
of a real
|
|
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
|
|
299
|
-
|
|
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
|
-
|
|
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:
|
|
311
|
-
*
|
|
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
|
|
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
|
|
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.
|
|
1
|
+
__version__ = "1.12.4"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dagster
|
|
3
|
-
Version: 1.12.
|
|
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.
|
|
63
|
-
Requires-Dist: dagster-shared==1.12.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
826
|
-
dagster-1.12.
|
|
827
|
-
dagster-1.12.
|
|
828
|
-
dagster-1.12.
|
|
829
|
-
dagster-1.12.
|
|
830
|
-
dagster-1.12.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|