Skip to content

Commit ede7146

Browse files
committed
address PR feedback for seed support
1 parent eaf268a commit ede7146

File tree

8 files changed

+42
-38
lines changed

8 files changed

+42
-38
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ and this project adheres to
88

99
## [Unreleased]
1010

11-
- Add support for linting and scoring dbt seeds (#104)
11+
- Add support for linting and scoring dbt seeds (#110)
1212

1313
## [0.11.0] - 2025-04-04
1414

docs/seed.md

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/dbt_score/dbt_utils.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,16 @@ def dbt_parse() -> "dbtRunnerResult":
6969
@dbt_required
7070
def dbt_ls(select: Iterable[str] | None) -> Iterable[str]:
7171
"""Run dbt ls."""
72-
cmd = ["ls", "--resource-types", "model", "source", "snapshot", "seed",
73-
"--output", "name"]
72+
cmd = [
73+
"ls",
74+
"--resource-types",
75+
"model",
76+
"source",
77+
"snapshot",
78+
"seed",
79+
"--output",
80+
"name",
81+
]
7482
if select:
7583
cmd += ["--select", *select]
7684

src/dbt_score/models.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,7 @@ def __hash__(self) -> int:
481481
"""Compute a unique hash for a snapshot."""
482482
return hash(self.unique_id)
483483

484+
484485
@dataclass
485486
class Seed(HasColumnsMixin):
486487
"""Represents a dbt seed.
@@ -561,6 +562,7 @@ def __hash__(self) -> int:
561562

562563
Evaluable: TypeAlias = Model | Source | Snapshot | Seed
563564

565+
564566
class ManifestLoader:
565567
"""Load the models, sources, snapshots, seeds and tests from the manifest."""
566568

@@ -599,8 +601,9 @@ def __init__(self, file_path: Path, select: Iterable[str] | None = None):
599601
if select:
600602
self._filter_evaluables(select)
601603

602-
if (len(self.models) + len(self.sources) + len(self.snapshots)
603-
+ len(self.seeds)) == 0:
604+
if (
605+
len(self.models) + len(self.sources) + len(self.snapshots) + len(self.seeds)
606+
) == 0:
604607
logger.warning("Nothing to evaluate!")
605608

606609
def _load_models(self) -> None:

src/dbt_score/rule.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
overload,
1515
)
1616

17-
from dbt_score.models import Evaluable, Model, Snapshot, Source
17+
from dbt_score.models import Evaluable, Model, Seed, Snapshot, Source
1818
from dbt_score.more_itertools import first_true
1919
from dbt_score.rule_filter import RuleFilter
2020

@@ -66,8 +66,12 @@ class RuleViolation:
6666
ModelRuleEvaluationType: TypeAlias = Callable[[Model], RuleViolation | None]
6767
SourceRuleEvaluationType: TypeAlias = Callable[[Source], RuleViolation | None]
6868
SnapshotRuleEvaluationType: TypeAlias = Callable[[Snapshot], RuleViolation | None]
69+
SeedRuleEvaluationType: TypeAlias = Callable[[Seed], RuleViolation | None]
6970
RuleEvaluationType: TypeAlias = (
70-
ModelRuleEvaluationType | SourceRuleEvaluationType | SnapshotRuleEvaluationType
71+
ModelRuleEvaluationType
72+
| SourceRuleEvaluationType
73+
| SnapshotRuleEvaluationType
74+
| SeedRuleEvaluationType
7175
)
7276

7377

@@ -206,6 +210,11 @@ def rule(__func: SnapshotRuleEvaluationType) -> Type[Rule]:
206210
...
207211

208212

213+
@overload
214+
def rule(__func: SeedRuleEvaluationType) -> Type[Rule]:
215+
...
216+
217+
209218
@overload
210219
def rule(
211220
*,

src/dbt_score/rule_filter.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,18 @@
44
import typing
55
from typing import Any, Callable, Type, TypeAlias, cast, overload
66

7-
from dbt_score.models import Evaluable, Model, Snapshot, Source
7+
from dbt_score.models import Evaluable, Model, Seed, Snapshot, Source
88
from dbt_score.more_itertools import first_true
99

1010
ModelFilterEvaluationType: TypeAlias = Callable[[Model], bool]
1111
SourceFilterEvaluationType: TypeAlias = Callable[[Source], bool]
1212
SnapshotFilterEvaluationType: TypeAlias = Callable[[Snapshot], bool]
13+
SeedRuleEvaluationType: TypeAlias = Callable[[Seed], bool]
1314
FilterEvaluationType: TypeAlias = (
1415
ModelFilterEvaluationType
1516
| SourceFilterEvaluationType
1617
| SnapshotFilterEvaluationType
18+
| SeedRuleEvaluationType
1719
)
1820

1921

@@ -87,6 +89,11 @@ def rule_filter(__func: SnapshotFilterEvaluationType) -> Type[RuleFilter]:
8789
...
8890

8991

92+
@overload
93+
def rule_filter(__func: SeedRuleEvaluationType) -> Type[RuleFilter]:
94+
...
95+
96+
9097
@overload
9198
def rule_filter(
9299
*,

src/dbt_score/rules/generic.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from dbt_score import Model, RuleViolation, Seed, Severity, Snapshot, rule
44
from dbt_score.rules.filters import is_table
55

6+
MAX_DESCRIPTION_MESSAGE_LENGTH = 60
7+
68

79
@rule
810
def snapshot_has_unique_key(snapshot: Snapshot) -> RuleViolation | None:
@@ -135,6 +137,7 @@ def has_no_unused_is_incremental(model: Model) -> RuleViolation | None:
135137
):
136138
return RuleViolation("Non-incremental model makes use of is_incremental().")
137139

140+
138141
@rule
139142
def seed_has_description(seed: Seed) -> RuleViolation | None:
140143
"""A seed should have a description."""
@@ -149,14 +152,13 @@ def seed_columns_have_description(seed: Seed) -> RuleViolation | None:
149152
column.name for column in seed.columns if not column.description
150153
]
151154
if invalid_column_names:
152-
max_length = 60
153155
message = f"Columns lack a description: {', '.join(invalid_column_names)}."
154-
if len(message) > max_length:
155-
message = f"{message[:60]}…"
156+
if len(message) > MAX_DESCRIPTION_MESSAGE_LENGTH:
157+
message = f"{message[:MAX_DESCRIPTION_MESSAGE_LENGTH]}…"
156158
return RuleViolation(message=message)
157159

158160

159-
@rule
161+
@rule(severity=Severity.LOW)
160162
def seed_has_tests(seed: Seed) -> RuleViolation | None:
161163
"""A seed should have at least one test."""
162164
if not seed.tests and not any(column.tests for column in seed.columns):

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,7 @@ def evaluate(self, snapshot: Snapshot) -> RuleViolation | None: # type: ignore[
470470

471471
return SnapshotRuleWithFilter
472472

473+
473474
@fixture
474475
def seed1(raw_manifest) -> Seed:
475476
"""Seed 1."""

0 commit comments

Comments
 (0)