dagster-dbt 0.28.6__py3-none-any.whl → 0.28.8__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_dbt/asset_utils.py +3 -0
- dagster_dbt/cloud_v2/run_handler.py +5 -0
- dagster_dbt/cloud_v2/sensor_builder.py +1 -1
- dagster_dbt/dagster_dbt_translator.py +19 -8
- dagster_dbt/dbt_project.py +36 -0
- dagster_dbt/include/pyproject.toml.jinja +1 -1
- dagster_dbt/version.py +1 -1
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/METADATA +4 -3
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/RECORD +13 -13
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/WHEEL +0 -0
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/entry_points.txt +0 -0
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/licenses/LICENSE +0 -0
- {dagster_dbt-0.28.6.dist-info → dagster_dbt-0.28.8.dist-info}/top_level.txt +0 -0
dagster_dbt/asset_utils.py
CHANGED
|
@@ -572,6 +572,9 @@ def default_metadata_from_dbt_resource_props(
|
|
|
572
572
|
dbt_resource_props.get("database"),
|
|
573
573
|
dbt_resource_props.get("schema"),
|
|
574
574
|
dbt_resource_props.get("alias"),
|
|
575
|
+
dbt_resource_props.get("name")
|
|
576
|
+
if dbt_resource_props.get("resource_type") == "source"
|
|
577
|
+
else None,
|
|
575
578
|
]
|
|
576
579
|
if relation_part
|
|
577
580
|
]
|
|
@@ -12,6 +12,7 @@ from dagster import (
|
|
|
12
12
|
get_dagster_logger,
|
|
13
13
|
)
|
|
14
14
|
from dagster._record import record
|
|
15
|
+
from dagster._time import get_current_timestamp
|
|
15
16
|
from dateutil import parser
|
|
16
17
|
from requests.exceptions import RequestException
|
|
17
18
|
|
|
@@ -80,6 +81,10 @@ class DbtCloudJobRunHandler:
|
|
|
80
81
|
|
|
81
82
|
|
|
82
83
|
def get_completed_at_timestamp(result: Mapping[str, Any]) -> float:
|
|
84
|
+
timing = result["timing"]
|
|
85
|
+
if len(timing) == 0:
|
|
86
|
+
# as a fallback, use the current timestamp
|
|
87
|
+
return get_current_timestamp()
|
|
83
88
|
# result["timing"] is a list of events in run_results.json
|
|
84
89
|
# For successful models and passing tests,
|
|
85
90
|
# the last item of that list includes the timing details of the execution.
|
|
@@ -142,7 +142,7 @@ def sorted_asset_events(
|
|
|
142
142
|
return [
|
|
143
143
|
sorted_event[1]
|
|
144
144
|
for sorted_event in sorted(
|
|
145
|
-
materializations_and_timestamps, key=lambda x: (
|
|
145
|
+
materializations_and_timestamps, key=lambda x: (topo_aks.index(x[1].asset_key), x[0])
|
|
146
146
|
)
|
|
147
147
|
]
|
|
148
148
|
|
|
@@ -62,6 +62,8 @@ class DagsterDbtTranslatorSettings(Resolvable):
|
|
|
62
62
|
rather than fully qualified name. Defaults to False.
|
|
63
63
|
enable_source_tests_as_checks (bool): Whether to load dbt source tests as Dagster asset checks.
|
|
64
64
|
Defaults to False. If False, asset observations will be emitted for source tests.
|
|
65
|
+
enable_source_metadata (bool): Whether to include metadata on AssetDep objects for dbt sources.
|
|
66
|
+
If set to True, enables the ability to remap upstream asset keys based on table name. Defaults to False.
|
|
65
67
|
"""
|
|
66
68
|
|
|
67
69
|
enable_asset_checks: bool = True
|
|
@@ -69,6 +71,7 @@ class DagsterDbtTranslatorSettings(Resolvable):
|
|
|
69
71
|
enable_code_references: bool = False
|
|
70
72
|
enable_dbt_selection_by_name: bool = False
|
|
71
73
|
enable_source_tests_as_checks: bool = False
|
|
74
|
+
enable_source_metadata: bool = False
|
|
72
75
|
|
|
73
76
|
|
|
74
77
|
class DagsterDbtTranslator:
|
|
@@ -145,15 +148,23 @@ class DagsterDbtTranslator:
|
|
|
145
148
|
|
|
146
149
|
# calculate the dependencies for the asset
|
|
147
150
|
upstream_ids = get_upstream_unique_ids(manifest, resource_props)
|
|
148
|
-
deps = [
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
),
|
|
151
|
+
deps: list[AssetDep] = []
|
|
152
|
+
for upstream_id in upstream_ids:
|
|
153
|
+
spec = self.get_asset_spec(manifest, upstream_id, project)
|
|
154
|
+
partition_mapping = self.get_partition_mapping(
|
|
155
|
+
resource_props, self.get_resource_props(manifest, upstream_id)
|
|
154
156
|
)
|
|
155
|
-
|
|
156
|
-
|
|
157
|
+
|
|
158
|
+
deps.append(
|
|
159
|
+
AssetDep(
|
|
160
|
+
asset=spec.key,
|
|
161
|
+
partition_mapping=partition_mapping,
|
|
162
|
+
metadata=spec.metadata
|
|
163
|
+
if self.settings.enable_source_metadata and upstream_id.startswith("source")
|
|
164
|
+
else None,
|
|
165
|
+
)
|
|
166
|
+
)
|
|
167
|
+
|
|
157
168
|
self_partition_mapping = self.get_partition_mapping(resource_props, resource_props)
|
|
158
169
|
if self_partition_mapping and has_self_dependency(resource_props):
|
|
159
170
|
deps.append(
|
dagster_dbt/dbt_project.py
CHANGED
|
@@ -132,6 +132,42 @@ class DagsterDbtProjectPreparer(DbtProjectPreparer):
|
|
|
132
132
|
.wait()
|
|
133
133
|
)
|
|
134
134
|
|
|
135
|
+
# Remove seed entries from partial_parse to force re-parsing at runtime.
|
|
136
|
+
# This ensures seeds get correct root_path based on current project location.
|
|
137
|
+
self._invalidate_seeds_in_partial_parse(project)
|
|
138
|
+
|
|
139
|
+
def _invalidate_seeds_in_partial_parse(self, project: "DbtProject") -> None:
|
|
140
|
+
"""Remove seed entries from partial_parse.msgpack to force re-parsing.
|
|
141
|
+
|
|
142
|
+
Seeds contain root_path which is an absolute path from build time. When state
|
|
143
|
+
is generated in one environment (e.g., CI/CD) and used in another (e.g., deployed
|
|
144
|
+
container), the root_path points to the wrong location and seed loading fails.
|
|
145
|
+
|
|
146
|
+
By removing seed entries from the cache, dbt will re-parse them at runtime with
|
|
147
|
+
the correct current project path. Models keep their cached data for fast loading.
|
|
148
|
+
"""
|
|
149
|
+
import msgpack
|
|
150
|
+
|
|
151
|
+
partial_parse_path = project.project_dir / project.target_path / "partial_parse.msgpack"
|
|
152
|
+
if not partial_parse_path.exists():
|
|
153
|
+
return
|
|
154
|
+
|
|
155
|
+
with open(partial_parse_path, "rb") as f:
|
|
156
|
+
data = msgpack.unpack(f, raw=False, strict_map_key=False)
|
|
157
|
+
|
|
158
|
+
# Remove seed nodes
|
|
159
|
+
seed_node_ids = [k for k in data.get("nodes", {}).keys() if k.startswith("seed.")]
|
|
160
|
+
for seed_id in seed_node_ids:
|
|
161
|
+
del data["nodes"][seed_id]
|
|
162
|
+
|
|
163
|
+
# Remove seed file entries (CSVs)
|
|
164
|
+
seed_file_ids = [k for k in data.get("files", {}).keys() if k.lower().endswith(".csv")]
|
|
165
|
+
for file_id in seed_file_ids:
|
|
166
|
+
del data["files"][file_id]
|
|
167
|
+
|
|
168
|
+
with open(partial_parse_path, "wb") as f:
|
|
169
|
+
msgpack.pack(data, f)
|
|
170
|
+
|
|
135
171
|
|
|
136
172
|
@record_custom
|
|
137
173
|
class DbtProject(IHaveNew):
|
dagster_dbt/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.28.
|
|
1
|
+
__version__ = "0.28.8"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dagster-dbt
|
|
3
|
-
Version: 0.28.
|
|
3
|
+
Version: 0.28.8
|
|
4
4
|
Summary: A Dagster integration for dbt
|
|
5
5
|
Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-dbt
|
|
6
6
|
Author: Dagster Labs
|
|
@@ -10,11 +10,12 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
10
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
11
11
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
13
14
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
15
|
Classifier: Operating System :: OS Independent
|
|
15
|
-
Requires-Python: >=3.10,<3.
|
|
16
|
+
Requires-Python: >=3.10,<3.15
|
|
16
17
|
License-File: LICENSE
|
|
17
|
-
Requires-Dist: dagster==1.12.
|
|
18
|
+
Requires-Dist: dagster==1.12.8
|
|
18
19
|
Requires-Dist: dbt-core<1.11,>=1.7
|
|
19
20
|
Requires-Dist: gitpython
|
|
20
21
|
Requires-Dist: Jinja2
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
dagster_dbt/__init__.py,sha256=rlPCxCzovXNDiqXBUEcgNVHjZrXQXwcX3kwUhe_69C4,4708
|
|
2
2
|
dagster_dbt/asset_decorator.py,sha256=OFFjhmDQO6dK8N3U7VQF7gergswkIS3eHnMRwAe2BZY,14892
|
|
3
3
|
dagster_dbt/asset_specs.py,sha256=2EdWIhY2QZhtGXM7N-kkkeK3ClnGgYX7ayRi_X11cLg,2741
|
|
4
|
-
dagster_dbt/asset_utils.py,sha256=
|
|
4
|
+
dagster_dbt/asset_utils.py,sha256=xS2gAWRdVlHnYkc5iu-ppf6dpdz_OHspeg9g_gc14fs,46790
|
|
5
5
|
dagster_dbt/compat.py,sha256=lqzGonzQE7Lb825yRqUaQPXeNQp8umAR4LqyD6COXdc,3609
|
|
6
|
-
dagster_dbt/dagster_dbt_translator.py,sha256=
|
|
6
|
+
dagster_dbt/dagster_dbt_translator.py,sha256=HnXtw9UgUMrrPDUrJ8__kMtOrYDHVz4jCBVXl_VbdHM,30834
|
|
7
7
|
dagster_dbt/dbt_core_version.py,sha256=w1P62qDdbApXKv0XvUNr2p7FlwiW68csugsNaqmjNjM,38
|
|
8
8
|
dagster_dbt/dbt_manifest.py,sha256=q10Qq1whh-dLfWtFbTYXYbqBVCf0oU8T1yRPyy9ASw0,1307
|
|
9
9
|
dagster_dbt/dbt_manifest_asset_selection.py,sha256=KSEHcVdtfFZaEqSQDUsAx8H8BQe62jZxAOE_CLtwVlI,5072
|
|
10
|
-
dagster_dbt/dbt_project.py,sha256=
|
|
10
|
+
dagster_dbt/dbt_project.py,sha256=Ftd3MHia6TJGhxY55omwwYOJ6HET5glxnLuztCfzJ9A,13847
|
|
11
11
|
dagster_dbt/dbt_project_manager.py,sha256=d4Jq5D5x4ElUOGVG-enlhYr0GMLgC-8uL3FegVHNAE0,6047
|
|
12
12
|
dagster_dbt/dbt_version.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
dagster_dbt/errors.py,sha256=a8xag0tjh8OQVkiL10_uwY4hkAgRCH6HtTGaZxIbXZI,1073
|
|
@@ -15,7 +15,7 @@ dagster_dbt/freshness_builder.py,sha256=DHAC3AGWAwIA7psDf72R0t5p8NjxDytGU9g5xnca
|
|
|
15
15
|
dagster_dbt/metadata_set.py,sha256=lqjASYoYeM_Ey6r8UsPUkRMwmuAIfFCFvkNm0xW5xTg,512
|
|
16
16
|
dagster_dbt/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
|
|
17
17
|
dagster_dbt/utils.py,sha256=gT6xO7buRolkhc2fa5ySUPfD1eXo3e6RJWZAKkM6yFo,8513
|
|
18
|
-
dagster_dbt/version.py,sha256=
|
|
18
|
+
dagster_dbt/version.py,sha256=rMjeJYs_MOkcUCEGMkmwm1PlX0JRu_r70Ywo8pJrCDs,23
|
|
19
19
|
dagster_dbt/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
20
|
dagster_dbt/cli/app.py,sha256=9oBx85uzAkMtBdV39vNm5rxuAGPVYzzDUs6Ek-KL0XY,13516
|
|
21
21
|
dagster_dbt/cloud/__init__.py,sha256=8WKaLuPl_pUG9Cv78GW782vrWQfqK8QtAWegkTxA9r4,441
|
|
@@ -30,8 +30,8 @@ dagster_dbt/cloud_v2/asset_decorator.py,sha256=wHL77K2NXvnU0PDEsqyqpiRX1yp1cuQii
|
|
|
30
30
|
dagster_dbt/cloud_v2/cli_invocation.py,sha256=8i0NTtExgKFR4-96YaFSqjFt5s05TY5BVpLEGUMrN9c,2392
|
|
31
31
|
dagster_dbt/cloud_v2/client.py,sha256=hXy87h2Hb3MM50OBWtV1KXE3MdfJqG-pIcvQO9eDDSY,20006
|
|
32
32
|
dagster_dbt/cloud_v2/resources.py,sha256=ENzllq2rJlD4Tb3_9JTsMVsoBjyKBs28543-L3lfxLU,16925
|
|
33
|
-
dagster_dbt/cloud_v2/run_handler.py,sha256=
|
|
34
|
-
dagster_dbt/cloud_v2/sensor_builder.py,sha256=
|
|
33
|
+
dagster_dbt/cloud_v2/run_handler.py,sha256=sX_cE_7lKXx_J2-k-Q_VQA_iTN8zh7sB3Cgm312Rj6U,10174
|
|
34
|
+
dagster_dbt/cloud_v2/sensor_builder.py,sha256=uVHpOG7-UBJikw4qNv793M9BKiF7XDJf3a8anFASHB4,10446
|
|
35
35
|
dagster_dbt/cloud_v2/types.py,sha256=dI-NIguj582LwTTMXdY5r0U4-INDn9anNy-ciGuEc1s,4136
|
|
36
36
|
dagster_dbt/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
37
|
dagster_dbt/components/dbt_project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -44,16 +44,16 @@ dagster_dbt/core/dbt_event_iterator.py,sha256=IL3QsVUDMfGk04SFTkrVEfbbYu745Kn8Oy
|
|
|
44
44
|
dagster_dbt/core/resource.py,sha256=1qIEneW2aZYeArF5w_QV4-Xmf7Kp9kpGaQaxUlL3ZZs,30851
|
|
45
45
|
dagster_dbt/core/utils.py,sha256=ciXjLhFTNVTyDtVWP4Kjee0LWZkIuVJOltvlv0COzDo,577
|
|
46
46
|
dagster_dbt/include/__init__.py,sha256=8ujr-ROlJ5x64POs-bH-0zfjZ2QHx-FgKUZAvAFbSs8,89
|
|
47
|
-
dagster_dbt/include/pyproject.toml.jinja,sha256=
|
|
47
|
+
dagster_dbt/include/pyproject.toml.jinja,sha256=sOq-DfM9QZB3iL2EMxKv7m34PvOLt1d549b5jReUV7Q,661
|
|
48
48
|
dagster_dbt/include/setup.py.jinja,sha256=N3NjYuXvWmaY8bj5GftVxVvImDUGC4YbFc_MdP1-quA,618
|
|
49
49
|
dagster_dbt/include/scaffold/__init__.py.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
50
50
|
dagster_dbt/include/scaffold/assets.py.jinja,sha256=JImqnDUP5ewy8RVti4IuXL70yJnoke54dMuZ3G8Wlx8,562
|
|
51
51
|
dagster_dbt/include/scaffold/definitions.py.jinja,sha256=Hou7emwkEeh5YXTdqjYFrAc2SK-Q6MgTNsQOKA_Vy3s,364
|
|
52
52
|
dagster_dbt/include/scaffold/project.py.jinja,sha256=YNtkT5Hq4VbGw-b7QcxdelhXsesIKORwVuBFGFdfeUs,432
|
|
53
53
|
dagster_dbt/include/scaffold/schedules.py.jinja,sha256=Xua_VtPjYFc498A5uaBGQ36GwV1gqciO4P3D8Yt9M-Y,413
|
|
54
|
-
dagster_dbt-0.28.
|
|
55
|
-
dagster_dbt-0.28.
|
|
56
|
-
dagster_dbt-0.28.
|
|
57
|
-
dagster_dbt-0.28.
|
|
58
|
-
dagster_dbt-0.28.
|
|
59
|
-
dagster_dbt-0.28.
|
|
54
|
+
dagster_dbt-0.28.8.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
|
|
55
|
+
dagster_dbt-0.28.8.dist-info/METADATA,sha256=0kn1py-8362ZJC8FvZrG1YIjwX_PKkG0EJyLYfSmrVk,1630
|
|
56
|
+
dagster_dbt-0.28.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
57
|
+
dagster_dbt-0.28.8.dist-info/entry_points.txt,sha256=pbv0tVoTB7cByG-noE8rC6atvthh64qBaTo7PkQ9HbM,163
|
|
58
|
+
dagster_dbt-0.28.8.dist-info/top_level.txt,sha256=hoOwFvw9OpJUN1azE6UVHcxMKqhUwR_BTN0Ay-iKUDA,12
|
|
59
|
+
dagster_dbt-0.28.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|