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 .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,5 @@ jobs:
--contract contracts/orders.yml \
--data data/samples/orders.csv \
--references data/samples \
--reference-time 2026-07-14T12:00:00Z \
--history-db "$DQO_DATABASE_URL"
16 changes: 16 additions & 0 deletions src/dqo/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,22 @@

import argparse
import sys
from datetime import datetime, timezone
from pathlib import Path

from src.dqo.alerts import AlertRouter, ConsoleAlertChannel, FileAlertChannel, WebhookAlertChannel
from src.dqo.history import HistoryStore
from src.dqo.runner import run_contract_file


def _parse_reference_time(value: str) -> datetime:
normalized = value.replace("Z", "+00:00")
parsed = datetime.fromisoformat(normalized)
if parsed.tzinfo is None:
return parsed.replace(tzinfo=timezone.utc)
return parsed


def build_parser() -> argparse.ArgumentParser:
parser = argparse.ArgumentParser(description="Run data-quality checks against contracts")
subparsers = parser.add_subparsers(dest="command", required=True)
Expand All @@ -23,6 +32,12 @@ def build_parser() -> argparse.ArgumentParser:
run_parser.add_argument("--alert-file", type=Path, default=Path(".dqo/alerts.jsonl"))
run_parser.add_argument("--webhook-url", type=str, default=None)
run_parser.add_argument("--no-console-alerts", action="store_true")
run_parser.add_argument(
"--reference-time",
type=_parse_reference_time,
default=None,
help="Evaluate freshness relative to this ISO-8601 timestamp (default: current UTC time)",
)

history_parser = subparsers.add_parser("history", help="Show recent runs")
history_parser.add_argument("--contract", required=True)
Expand All @@ -41,6 +56,7 @@ def main(argv: list[str] | None = None) -> int:
args.contract,
args.data,
reference_dir=args.references,
now=args.reference_time,
)

store = HistoryStore(database_url=args.history_db)
Expand Down
24 changes: 24 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pathlib import Path

from src.dqo.cli import main


def test_cli_run_passes_with_reference_time(tmp_path: Path) -> None:
exit_code = main(
[
"run",
"--contract",
"contracts/orders.yml",
"--data",
"data/samples/orders.csv",
"--references",
"data/samples",
"--reference-time",
"2026-07-14T12:00:00Z",
"--no-console-alerts",
"--history-db",
f"sqlite:///{tmp_path / 'history.db'}",
]
)

assert exit_code == 0
Loading