Skip to content

Commit 8a0ece7

Browse files
committed
add dbt 1.9 support
1 parent 35d2598 commit 8a0ece7

File tree

6 files changed

+100
-85
lines changed

6 files changed

+100
-85
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def read(*names, **kwargs):
6363
python_requires=">=3.8",
6464
install_requires=[
6565
"click==8.1.7",
66-
"dbt-artifacts-parser==0.6.0",
66+
"dbt-artifacts-parser==0.8.1",
6767
"ruamel.yaml==0.18.6",
6868
"tabulate==0.9.0",
6969
"requests==2.31.0",

src/datapilot/core/platforms/dbt/schemas/manifest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ class Config:
5454

5555

5656
class AltimateDependsOn(BaseModel):
57-
nodes: Optional[List[str]]
58-
macros: Optional[List[str]]
57+
nodes: Optional[List[str]] = None
58+
macros: Optional[List[str]] = None
5959

6060

6161
class AltimateManifestColumnInfo(BaseModel):

src/datapilot/core/platforms/dbt/wrappers/manifest/v10/wrapper.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
116116
contract=contract,
117117
meta=node.meta,
118118
patch_path=node.patch_path,
119+
access=node.access.value,
119120
)
120121

121122
def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
@@ -177,7 +178,7 @@ def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
177178
),
178179
description=macro.description,
179180
meta=macro.meta,
180-
docs=macro.docs,
181+
docs=macro.docs.dict() if macro.docs else None,
181182
patch_path=macro.patch_path,
182183
arguments=[AltimateMacroArgument(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
183184
created_at=macro.created_at,

src/datapilot/core/platforms/dbt/wrappers/manifest/v11/wrapper.py

Lines changed: 75 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
6161
language,
6262
contract,
6363
) = ([], [], None, None, None, None, None, "", "", None)
64-
if node.resource_type.value != SEED:
64+
if node.resource_type != SEED:
6565
sources = node.sources
6666
metrics = node.metrics
6767
depends_on_nodes = node.depends_on.nodes if node.depends_on else None
@@ -77,7 +77,7 @@ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
7777
database=node.database,
7878
schema_name=node.schema_,
7979
name=node.name,
80-
resource_type=AltimateResourceType(node.resource_type.value),
80+
resource_type=AltimateResourceType(node.resource_type),
8181
package_name=node.package_name,
8282
path=node.path,
8383
description=node.description,
@@ -116,12 +116,13 @@ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
116116
contract=contract,
117117
meta=node.meta,
118118
patch_path=node.patch_path,
119+
access=node.access.value,
119120
)
120121

121122
def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
122123
return AltimateManifestSourceNode(
123124
database=source.database,
124-
resource_type=AltimateResourceType(source.resource_type.value),
125+
resource_type=AltimateResourceType(source.resource_type),
125126
schema_name=source.schema_,
126127
name=source.name,
127128
package_name=source.package_name,
@@ -162,7 +163,7 @@ def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
162163
def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
163164
return AltimateManifestMacroNode(
164165
name=macro.name,
165-
resource_type=AltimateResourceType(macro.resource_type.value),
166+
resource_type=AltimateResourceType(macro.resource_type),
166167
package_name=macro.package_name,
167168
path=macro.path,
168169
original_file_path=macro.original_file_path,
@@ -177,7 +178,7 @@ def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
177178
),
178179
description=macro.description,
179180
meta=macro.meta,
180-
docs=macro.docs,
181+
docs=macro.docs.dict() if macro.docs else None,
181182
patch_path=macro.patch_path,
182183
arguments=[AltimateMacroArgument(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
183184
created_at=macro.created_at,
@@ -187,7 +188,7 @@ def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
187188
def _get_exposure(self, exposure: ExposureNode) -> AltimateManifestExposureNode:
188189
return AltimateManifestExposureNode(
189190
name=exposure.name,
190-
resource_type=AltimateResourceType(exposure.resource_type.value),
191+
resource_type=AltimateResourceType(exposure.resource_type),
191192
package_name=exposure.package_name,
192193
path=exposure.path,
193194
original_file_path=exposure.original_file_path,
@@ -203,12 +204,14 @@ def _get_exposure(self, exposure: ExposureNode) -> AltimateManifestExposureNode:
203204
config=AltimateSourceConfig(**exposure.config.dict()) if exposure.config else None,
204205
unrendered_config=exposure.unrendered_config,
205206
url=exposure.url,
206-
depends_on=AltimateDependsOn(
207-
nodes=exposure.depends_on.nodes,
208-
macros=exposure.depends_on.macros,
209-
)
210-
if exposure.depends_on
211-
else None,
207+
depends_on=(
208+
AltimateDependsOn(
209+
nodes=exposure.depends_on.nodes,
210+
macros=exposure.depends_on.macros,
211+
)
212+
if exposure.depends_on
213+
else None
214+
),
212215
refs=[AltimateRefArgs(**ref.dict()) for ref in exposure.refs] if exposure.refs else None,
213216
sources=exposure.sources,
214217
metrics=exposure.metrics,
@@ -228,35 +231,39 @@ def _get_tests(self, test: TestNode) -> AltimateManifestTestNode:
228231
test_metadata=test_metadata,
229232
test_type=test_type,
230233
name=test.name,
231-
resource_type=AltimateResourceType(test.resource_type.value),
234+
resource_type=AltimateResourceType(test.resource_type),
232235
package_name=test.package_name,
233236
path=test.path,
234237
original_file_path=test.original_file_path,
235238
unique_id=test.unique_id,
236239
fqn=test.fqn,
237240
alias=test.alias,
238-
checksum=AltimateFileHash(
239-
name=test.checksum.name,
240-
checksum=test.checksum.checksum,
241-
)
242-
if test.checksum
243-
else None,
241+
checksum=(
242+
AltimateFileHash(
243+
name=test.checksum.name,
244+
checksum=test.checksum.checksum,
245+
)
246+
if test.checksum
247+
else None
248+
),
244249
config=AltimateTestConfig(**test.config.dict()) if test.config else None,
245250
description=test.description,
246251
tags=test.tags,
247-
columns={
248-
name: AltimateManifestColumnInfo(
249-
name=column.name,
250-
description=column.description,
251-
meta=column.meta,
252-
data_type=column.data_type,
253-
quote=column.quote,
254-
tags=column.tags,
255-
)
256-
for name, column in test.columns.items()
257-
}
258-
if test.columns
259-
else None,
252+
columns=(
253+
{
254+
name: AltimateManifestColumnInfo(
255+
name=column.name,
256+
description=column.description,
257+
meta=column.meta,
258+
data_type=column.data_type,
259+
quote=column.quote,
260+
tags=column.tags,
261+
)
262+
for name, column in test.columns.items()
263+
}
264+
if test.columns
265+
else None
266+
),
260267
meta=test.meta,
261268
relation_name=test.relation_name,
262269
group=test.group,
@@ -265,12 +272,14 @@ def _get_tests(self, test: TestNode) -> AltimateManifestTestNode:
265272
refs=[AltimateRefArgs(**ref.dict()) for ref in test.refs] if test.refs else None,
266273
sources=test.sources,
267274
metrics=test.metrics,
268-
depends_on=AltimateDependsOn(
269-
nodes=test.depends_on.nodes,
270-
macros=test.depends_on.macros,
271-
)
272-
if test.depends_on
273-
else None,
275+
depends_on=(
276+
AltimateDependsOn(
277+
nodes=test.depends_on.nodes,
278+
macros=test.depends_on.macros,
279+
)
280+
if test.depends_on
281+
else None
282+
),
274283
compiled_path=test.compiled_path,
275284
compiled=test.compiled,
276285
compiled_code=test.compiled_code,
@@ -281,35 +290,39 @@ def _get_seed(self, seed: SeedNodeMap) -> AltimateSeedNode:
281290
database=seed.database,
282291
schema_name=seed.schema_,
283292
name=seed.name,
284-
resource_type=AltimateResourceType(seed.resource_type.value),
293+
resource_type=AltimateResourceType(seed.resource_type),
285294
package_name=seed.package_name,
286295
path=seed.path,
287296
original_file_path=seed.original_file_path,
288297
unique_id=seed.unique_id,
289298
fqn=seed.fqn,
290299
alias=seed.alias,
291-
checksum=AltimateFileHash(
292-
name=seed.checksum.name,
293-
checksum=seed.checksum.checksum,
294-
)
295-
if seed.checksum
296-
else None,
300+
checksum=(
301+
AltimateFileHash(
302+
name=seed.checksum.name,
303+
checksum=seed.checksum.checksum,
304+
)
305+
if seed.checksum
306+
else None
307+
),
297308
config=AltimateSeedConfig(**seed.config.dict()) if seed.config else None,
298309
description=seed.description,
299310
tags=seed.tags,
300-
columns={
301-
name: AltimateManifestColumnInfo(
302-
name=column.name,
303-
description=column.description,
304-
meta=column.meta,
305-
data_type=column.data_type,
306-
quote=column.quote,
307-
tags=column.tags,
308-
)
309-
for name, column in seed.columns.items()
310-
}
311-
if seed.columns
312-
else None,
311+
columns=(
312+
{
313+
name: AltimateManifestColumnInfo(
314+
name=column.name,
315+
description=column.description,
316+
meta=column.meta,
317+
data_type=column.data_type,
318+
quote=column.quote,
319+
tags=column.tags,
320+
)
321+
for name, column in seed.columns.items()
322+
}
323+
if seed.columns
324+
else None
325+
),
313326
meta=seed.meta,
314327
group=seed.group,
315328
docs=seed.docs.dict() if seed.docs else None,
@@ -327,7 +340,7 @@ def get_nodes(
327340
nodes = {}
328341
for node in self.manifest.nodes.values():
329342
if (
330-
node.resource_type.value
343+
node.resource_type
331344
in [
332345
AltimateResourceType.seed.value,
333346
AltimateResourceType.test.value,
@@ -350,7 +363,7 @@ def get_sources(self) -> Dict[str, AltimateManifestSourceNode]:
350363
def get_macros(self) -> Dict[str, AltimateManifestMacroNode]:
351364
macros = {}
352365
for macro in self.manifest.macros.values():
353-
if macro.resource_type.value == AltimateResourceType.macro.value and macro.package_name == self.get_package():
366+
if macro.resource_type == AltimateResourceType.macro.value and macro.package_name == self.get_package():
354367
macros[macro.unique_id] = self._get_macro(macro)
355368
return macros
356369

@@ -371,15 +384,15 @@ def get_tests(self, type=None) -> Dict[str, AltimateManifestTestNode]:
371384

372385
for node in self.manifest.nodes.values():
373386
# Check if the node is a test and of the correct type
374-
if node.resource_type.value == AltimateResourceType.test.value:
387+
if node.resource_type == AltimateResourceType.test.value:
375388
if any(isinstance(node, t) for t in types):
376389
tests[node.unique_id] = self._get_tests(node)
377390
return tests
378391

379392
def get_seeds(self) -> Dict[str, AltimateSeedNode]:
380393
seeds = {}
381394
for seed in self.manifest.nodes.values():
382-
if seed.resource_type.value == AltimateResourceType.seed.value:
395+
if seed.resource_type == AltimateResourceType.seed.value:
383396
seeds[seed.unique_id] = self._get_seed(seed)
384397
return seeds
385398

src/datapilot/core/platforms/dbt/wrappers/manifest/v12/schemas.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,33 @@
44

55
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Exposures
66
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Macros
7-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node
8-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node1
9-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node2
10-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node3
11-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node4
12-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node5
13-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node6
14-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node7
7+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes
8+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes1
9+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes2
10+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes3
11+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes4
12+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes5
13+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes6
14+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes7
1515
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Sources
1616

1717
from datapilot.core.platforms.dbt.constants import GENERIC
1818
from datapilot.core.platforms.dbt.constants import SINGULAR
1919

20-
ManifestNode = Union[Node, Node1, Node2, Node3, Node4, Node5, Node6, Node7]
20+
ManifestNode = Union[Nodes, Nodes1, Nodes2, Nodes3, Nodes4, Nodes5, Nodes6, Nodes7]
2121

2222
SourceNode = Sources
2323

2424
ExposureNode = Exposures
2525

26-
TestNode = Union[Node6, Node2]
26+
TestNode = Union[Nodes6, Nodes2]
2727

2828
MacroNode = Macros
2929

3030
TEST_TYPE_TO_NODE_MAP: Dict[str, Type] = {
31-
GENERIC: [Node6],
32-
SINGULAR: [Node2],
31+
GENERIC: [Nodes6],
32+
SINGULAR: [Nodes2],
3333
}
3434

3535

36-
SeedNodeMap = Node
36+
SeedNodeMap = Nodes

src/datapilot/core/platforms/dbt/wrappers/manifest/v12/wrapper.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
from typing import Set
44

55
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import ManifestV12
6-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node2
7-
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Node6
6+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes2
7+
from dbt_artifacts_parser.parsers.manifest.manifest_v12 import Nodes6
88

99
from datapilot.core.platforms.dbt.constants import GENERIC
1010
from datapilot.core.platforms.dbt.constants import OTHER_TEST_NODE
@@ -116,6 +116,7 @@ def _get_node(self, node: ManifestNode) -> AltimateManifestNode:
116116
contract=contract,
117117
meta=node.meta,
118118
patch_path=node.patch_path,
119+
access=node.access.value,
119120
)
120121

121122
def _get_source(self, source: SourceNode) -> AltimateManifestSourceNode:
@@ -177,7 +178,7 @@ def _get_macro(self, macro: MacroNode) -> AltimateManifestMacroNode:
177178
),
178179
description=macro.description,
179180
meta=macro.meta,
180-
docs=macro.docs,
181+
docs=macro.docs.dict() if macro.docs else None,
181182
patch_path=macro.patch_path,
182183
arguments=[AltimateMacroArgument(**arg.dict()) for arg in macro.arguments] if macro.arguments else None,
183184
created_at=macro.created_at,
@@ -219,10 +220,10 @@ def _get_exposure(self, exposure: ExposureNode) -> AltimateManifestExposureNode:
219220

220221
def _get_tests(self, test: TestNode) -> AltimateManifestTestNode:
221222
test_metadata = None
222-
if isinstance(test, Node6):
223+
if isinstance(test, Nodes6):
223224
test_type = GENERIC
224225
test_metadata = AltimateTestMetadata(**test.test_metadata.dict()) if test.test_metadata else None
225-
elif isinstance(test, Node2):
226+
elif isinstance(test, Nodes2):
226227
test_type = SINGULAR
227228
else:
228229
test_type = OTHER_TEST_NODE
@@ -375,7 +376,7 @@ def get_exposures(self) -> Dict[str, AltimateManifestExposureNode]:
375376
def get_tests(self, type=None) -> Dict[str, AltimateManifestTestNode]:
376377
tests = {}
377378
# Initialize types_union with TestNode
378-
types = [Node2, Node6]
379+
types = [Nodes2, Nodes6]
379380

380381
# Add other types to the union if provided
381382
if type:

0 commit comments

Comments
 (0)