Skip to content

Commit 4002b70

Browse files
committed
feat: widen dbt-core compatibility range
1 parent 5c252f3 commit 4002b70

File tree

4 files changed

+79
-28
lines changed

4 files changed

+79
-28
lines changed

.github/workflows/pr.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ on:
88
concurrency:
99
group: 'pr-${{ github.event.pull_request.number }}'
1010
cancel-in-progress: true
11+
permissions:
12+
contents: read
1113
jobs:
1214
test-vscode:
1315
env:
@@ -66,3 +68,34 @@ jobs:
6668
name: playwright-report
6769
path: vscode/extension/playwright-report/
6870
retention-days: 30
71+
test-dbt-versions:
72+
runs-on: ubuntu-latest
73+
strategy:
74+
fail-fast: false
75+
matrix:
76+
dbt-version: ["1.3.0", "1.4.0", "1.5.0", "1.6.0", "1.7.0", "1.8.0", "1.9.0", "1.10.0"]
77+
steps:
78+
- uses: actions/checkout@v5
79+
- name: Set up Python
80+
uses: actions/setup-python@v5
81+
with:
82+
python-version: '3.10'
83+
- name: Install SQLMesh dev dependencies
84+
run: |
85+
python -m venv .venv
86+
source .venv/bin/activate
87+
make install-dev
88+
- name: Install dbt-core version
89+
run: |
90+
source .venv/bin/activate
91+
pip install "dbt-core~=${{ matrix.dbt-version }}"
92+
pip install pydantic>=2.0.0 --force-reinstall
93+
- name: Run dbt tests
94+
run: |
95+
source .venv/bin/activate
96+
make dbt-test
97+
- name: Test SQLMesh info in sushi_dbt
98+
working-directory: ./examples/sushi_dbt
99+
run: |
100+
source ../../.venv/bin/activate
101+
sqlmesh info --skip-connection

sqlmesh/dbt/manifest.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@
1515
from sqlmesh.utils.conversions import make_serializable
1616

1717
# Override the file name to prevent dbt commands from invalidating the cache.
18-
dbt_constants.PARTIAL_PARSE_FILE_NAME = "sqlmesh_partial_parse.msgpack"
18+
if hasattr(dbt_constants, "PARTIAL_PARSE_FILE_NAME"):
19+
dbt_constants.PARTIAL_PARSE_FILE_NAME = "sqlmesh_partial_parse.msgpack"
20+
else:
21+
from dbt.parser import manifest as dbt_manifest
22+
23+
dbt_manifest.PARTIAL_PARSE_FILE_NAME = "sqlmesh_partial_parse.msgpack"
1924

2025
import jinja2
2126
from dbt.adapters.factory import register_adapter, reset_adapters
@@ -377,11 +382,17 @@ def _load_on_run_start_end(self) -> None:
377382

378383
if "on-run-start" in node.tags:
379384
self._on_run_start_per_package[node.package_name][node_name] = HookConfig(
380-
sql=sql, index=node.index or 0, path=node_path, dependencies=dependencies
385+
sql=sql,
386+
index=getattr(node, "index", None) or 0,
387+
path=node_path,
388+
dependencies=dependencies,
381389
)
382390
else:
383391
self._on_run_end_per_package[node.package_name][node_name] = HookConfig(
384-
sql=sql, index=node.index or 0, path=node_path, dependencies=dependencies
392+
sql=sql,
393+
index=getattr(node, "index", None) or 0,
394+
path=node_path,
395+
dependencies=dependencies,
385396
)
386397

387398
@property
@@ -591,6 +602,9 @@ def _macro_references(
591602
manifest: Manifest, node: t.Union[ManifestNode, Macro]
592603
) -> t.Set[MacroReference]:
593604
result: t.Set[MacroReference] = set()
605+
if not hasattr(node, "depends_on"):
606+
return result
607+
594608
for macro_node_id in node.depends_on.macros:
595609
if not macro_node_id:
596610
continue
@@ -606,18 +620,20 @@ def _macro_references(
606620

607621
def _refs(node: ManifestNode) -> t.Set[str]:
608622
if DBT_VERSION >= (1, 5, 0):
609-
result = set()
623+
result: t.Set[str] = set()
624+
if not hasattr(node, "refs"):
625+
return result
610626
for r in node.refs:
611-
ref_name = f"{r.package}.{r.name}" if r.package else r.name
627+
ref_name = f"{r.package}.{r.name}" if r.package else r.name # type: ignore
612628
if getattr(r, "version", None):
613-
ref_name = f"{ref_name}_v{r.version}"
629+
ref_name = f"{ref_name}_v{r.version}" # type: ignore
614630
result.add(ref_name)
615631
return result
616632
return {".".join(r) for r in node.refs} # type: ignore
617633

618634

619635
def _sources(node: ManifestNode) -> t.Set[str]:
620-
return {".".join(s) for s in node.sources}
636+
return {".".join(s) for s in getattr(node, "sources", [])}
621637

622638

623639
def _model_node_id(model_name: str, package: str) -> str:

sqlmesh/dbt/seed.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -90,31 +90,33 @@ def to_sqlmesh(
9090
)
9191

9292

93-
class Integer(agate_helper.Integer):
94-
def cast(self, d: t.Any) -> t.Optional[int]:
95-
if isinstance(d, str):
96-
# The dbt's implementation doesn't support coercion of strings to integers.
97-
if d.strip().lower() in self.null_values:
98-
return None
99-
try:
100-
return int(d)
101-
except ValueError:
102-
raise agate.exceptions.CastError('Can not parse value "%s" as Integer.' % d)
103-
return super().cast(d)
104-
105-
def jsonify(self, d: t.Any) -> str:
106-
return d
107-
108-
109-
agate_helper.Integer = Integer # type: ignore
110-
111-
11293
AGATE_TYPE_MAPPING = {
113-
agate_helper.Integer: exp.DataType.build("int"),
11494
agate_helper.Number: exp.DataType.build("double"),
11595
agate_helper.ISODateTime: exp.DataType.build("datetime"),
11696
agate.Date: exp.DataType.build("date"),
11797
agate.DateTime: exp.DataType.build("datetime"),
11898
agate.Boolean: exp.DataType.build("boolean"),
11999
agate.Text: exp.DataType.build("text"),
120100
}
101+
102+
103+
if hasattr(agate_helper, "Integer"):
104+
105+
class Integer(agate_helper.Integer):
106+
def cast(self, d: t.Any) -> t.Optional[int]:
107+
if isinstance(d, str):
108+
# The dbt's implementation doesn't support coercion of strings to integers.
109+
if d.strip().lower() in self.null_values:
110+
return None
111+
try:
112+
return int(d)
113+
except ValueError:
114+
raise agate.exceptions.CastError('Can not parse value "%s" as Integer.' % d)
115+
return super().cast(d)
116+
117+
def jsonify(self, d: t.Any) -> str:
118+
return d
119+
120+
agate_helper.Integer = Integer # type: ignore
121+
122+
AGATE_TYPE_MAPPING[agate_helper.Integer] = exp.DataType.build("int")

tests/dbt/test_integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import pandas as pd # noqa: TID253
99
import pytest
10-
from dbt.cli.main import dbtRunner
10+
from dbt.cli.main import dbtRunner # type: ignore
1111
import time_machine
1212

1313
from sqlmesh import Context

0 commit comments

Comments
 (0)