Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to
## [Unreleased]

- Add debug mode to help writing new rules. (#91)
- Fix tests without metadata. (#88)

## [0.9.0] - 2024-12-19

Expand Down
32 changes: 18 additions & 14 deletions src/dbt_score/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ def from_node(cls, test_node: dict[str, Any]) -> "Test":
"""Create a test object from a test node in the manifest."""
return cls(
name=test_node["name"],
type=test_node["test_metadata"]["name"],
kwargs=test_node["test_metadata"].get("kwargs", {}),
type=test_node.get("test_metadata", {}).get("name", "generic"),
kwargs=test_node.get("test_metadata", {}).get("kwargs", {}),
tags=test_node.get("tags", []),
_raw_values=test_node,
)
Expand Down Expand Up @@ -141,7 +141,10 @@ def _get_columns(
[
test
for test in test_values
if test["test_metadata"]["kwargs"].get("column_name") == name
if test.get("test_metadata", {})
.get("kwargs", {})
.get("column_name")
== name
],
)
for name, values in node_values.get("columns", {}).items()
Expand Down Expand Up @@ -224,7 +227,9 @@ def from_node(
tests=[
Test.from_node(test)
for test in test_values
if not test["test_metadata"]["kwargs"].get("column_name")
if not test.get("test_metadata", {})
.get("kwargs", {})
.get("column_name")
],
depends_on=node_values["depends_on"],
_raw_values=node_values,
Expand Down Expand Up @@ -359,7 +364,9 @@ def from_node(
tests=[
Test.from_node(test)
for test in test_values
if not test["test_metadata"]["kwargs"].get("column_name")
if not test.get("test_metadata", {})
.get("kwargs", {})
.get("column_name")
],
_raw_values=node_values,
_raw_test_values=test_values,
Expand Down Expand Up @@ -428,20 +435,17 @@ def _reindex_tests(self) -> None:
"""Index tests based on their associated evaluable."""
for node_values in self.raw_nodes.values():
if node_values.get("resource_type") == "test":
# tests for models have a non-null value for `attached_node`
# Tests for models have a non-null value for `attached_node`
if attached_node := node_values.get("attached_node"):
self.tests[attached_node].append(node_values)

# Tests for sources will have a null `attached_node`,
# and a non-empty list for `sources`.
# They need to be attributed to the source id
# Tests for sources or separate tests will have `attached_node` == null.
# They need to be attributed to the node id
# based on the `depends_on` field.
elif node_values.get("sources") and (
source_unique_id := next(
iter(node_values.get("depends_on", {}).get("nodes", [])), None
)
elif node_unique_id := next(
iter(node_values.get("depends_on", {}).get("nodes", [])), None
):
self.tests[source_unique_id].append(node_values)
self.tests[node_unique_id].append(node_values)

def _filter_evaluables(self, select: Iterable[str]) -> None:
"""Filter evaluables like dbt's --select."""
Expand Down
7 changes: 7 additions & 0 deletions tests/resources/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,13 @@
"resource_type": "test",
"package_name": "package"
},
"test.package.test4": {
"resource_type": "test",
"depends_on": { "nodes": ["model.package.model1"] },
"name": "test4",
"package_name": "package",
"tags": []
},
"test.package.source_test1": {
"resource_type": "test",
"package_name": "package",
Expand Down
1 change: 1 addition & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ def test_manifest_load(mock_read_text, raw_manifest):
]
)
assert loader.models[0].tests[0].name == "test2"
assert loader.models[0].tests[1].name == "test4"
assert loader.models[0].columns[0].tests[0].name == "test1"

assert len(loader.sources) == len(
Expand Down
Loading