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.
@@ -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: (x[0], topo_aks.index(x[1].asset_key))
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
- AssetDep(
150
- asset=self.get_asset_spec(manifest, upstream_id, project).key,
151
- partition_mapping=self.get_partition_mapping(
152
- resource_props, self.get_resource_props(manifest, upstream_id)
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
- for upstream_id in upstream_ids
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(
@@ -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):
@@ -3,7 +3,7 @@ name = "{{ project_name }}"
3
3
  version = "0.1.0"
4
4
  description = "Add your description here"
5
5
  readme = "README.md"
6
- requires-python = ">=3.10,<3.14"
6
+ requires-python = ">=3.10,<3.15"
7
7
  dependencies = [
8
8
  "dagster",
9
9
  "dagster-cloud",
dagster_dbt/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.28.6"
1
+ __version__ = "0.28.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster-dbt
3
- Version: 0.28.6
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.14
16
+ Requires-Python: >=3.10,<3.15
16
17
  License-File: LICENSE
17
- Requires-Dist: dagster==1.12.6
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=HMy-_ifUG7vtsUU0lGaPum99Wn6NXEOjIfg4nW0sw7U,46657
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=skUpl7NxG7ysDfDOs1pSq1c9-ciByN7LrGvO0ZsC4W4,30274
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=HtUuNYbKMAPWqTOPgPeJK4u6b1nKyqHrRNB8sYwOWVw,12203
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=b5kdBWIZTaI8Q8AFU25gXvG6Pk4-ffI6MZboEwGcgSI,23
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=3qlZ3aeOMZP4oYJLkdRa5Lanf2tmLT0KpuRZ9kAgB6E,9981
34
- dagster_dbt/cloud_v2/sensor_builder.py,sha256=8mAm-1ZFvoiVVdxSkSQbMxg18aQUY5kazur7nBVgotM,10446
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=_BbC3zmV6ajtGnDMesyut0Yl0Fc7bY-F887KTIKMm1o,661
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.6.dist-info/licenses/LICENSE,sha256=4lsMW-RCvfVD4_F57wrmpe3vX1xwUk_OAKKmV_XT7Z0,11348
55
- dagster_dbt-0.28.6.dist-info/METADATA,sha256=2DItOvi04u4qY6aswQby3iENuziSwD9MBFDyYiwKliw,1579
56
- dagster_dbt-0.28.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
- dagster_dbt-0.28.6.dist-info/entry_points.txt,sha256=pbv0tVoTB7cByG-noE8rC6atvthh64qBaTo7PkQ9HbM,163
58
- dagster_dbt-0.28.6.dist-info/top_level.txt,sha256=hoOwFvw9OpJUN1azE6UVHcxMKqhUwR_BTN0Ay-iKUDA,12
59
- dagster_dbt-0.28.6.dist-info/RECORD,,
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,,