Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
171a228
update
CasperTeirlinck Apr 2, 2026
c7310b9
add adr
CasperTeirlinck Apr 3, 2026
c5e9de5
Keep only ADR, reset other changes
CasperTeirlinck Apr 3, 2026
02fb78f
update
CasperTeirlinck Apr 2, 2026
65b9874
plugins & docs
CasperTeirlinck Apr 3, 2026
f72a9a0
update
CasperTeirlinck Apr 8, 2026
ef95b82
update
CasperTeirlinck Apr 8, 2026
a96bae7
update tests
CasperTeirlinck Apr 20, 2026
2a1f968
Merge branch 'feat/metric-measurement-split' into feat/cli
CasperTeirlinck Apr 21, 2026
54cd0e1
Merge branch 'feat/metric-measurement-split' into feat/consolemateria…
CasperTeirlinck Apr 21, 2026
b06a6dd
PR coment and rebase on metric/measurement split
CasperTeirlinck Apr 21, 2026
f495bc3
update grouping
CasperTeirlinck Apr 21, 2026
809756c
Merge branch 'feat/consolematerializer-update' into feat/cli
CasperTeirlinck Apr 21, 2026
8256abd
update
CasperTeirlinck Apr 21, 2026
7beda35
dependency
CasperTeirlinck Apr 21, 2026
32824d4
rename to .measure()
CasperTeirlinck Apr 21, 2026
9070cf0
Merge branch 'feat/metric-measurement-split' into feat/consolemateria…
CasperTeirlinck Apr 21, 2026
29b9f90
rebase
CasperTeirlinck Apr 21, 2026
4a56bcf
Merge branch 'feat/metric-measurement-split' into feat/cli
CasperTeirlinck Apr 21, 2026
eabf848
Merge branch 'feat/consolematerializer-update' into feat/cli
CasperTeirlinck Apr 21, 2026
53d816e
remove check
CasperTeirlinck Apr 21, 2026
7891264
Merge branch 'main' into feat/cli
CasperTeirlinck Apr 21, 2026
78cb071
update
CasperTeirlinck Apr 21, 2026
78a782c
update
CasperTeirlinck Apr 21, 2026
ac35f12
redundant tests
CasperTeirlinck Apr 21, 2026
408149c
split wizard module
CasperTeirlinck Apr 23, 2026
32a44b1
parsecliitem tests
CasperTeirlinck Apr 23, 2026
3f3c545
updated env var parsing logging
CasperTeirlinck Apr 23, 2026
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
678 changes: 678 additions & 0 deletions checkup.schema.json

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions checkup.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# yaml-language-server: $schema=checkup.schema.json

tags:
project: checkup

providers:
- name: git

metrics:
- name: git_days_since_last_update
- name: git_tracked_file_count
pattern: src/checkup/*
- name: python_version
- name: python_version_check
min_version: '3.13'
max_version: '3.15'
3 changes: 3 additions & 0 deletions plugins/checkup-airflow/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
airflow = "checkup_airflow:AirflowProvider"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
3 changes: 3 additions & 0 deletions plugins/checkup-bitbucket/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
bitbucket = "checkup_bitbucket:BitbucketProvider"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
8 changes: 8 additions & 0 deletions plugins/checkup-conveyor/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ dependencies = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
conveyor = "checkup_conveyor:ConveyorProvider"

[project.entry-points."checkup.metrics"]
conveyor_last_deployment_time = "checkup_conveyor.conveyor_metric:ConveyorLastDeploymentTime"
conveyor_is_dirty_deployment = "checkup_conveyor.conveyor_metric:ConveyorIsDirtyDeployment"
conveyor_last_run_status = "checkup_conveyor.conveyor_metric:ConveyorLastRunStatus"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
27 changes: 27 additions & 0 deletions plugins/checkup-dbt/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,33 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
dbt = "checkup_dbt:DbtManifestProvider"

[project.entry-points."checkup.metrics"]
dbt_models = "checkup_dbt:DbtModelsMetric"
dbt_columns = "checkup_dbt:DbtColumnsMetric"
dbt_tests = "checkup_dbt:DbtTestsMetric"
dbt_models_with_description = "checkup_dbt:DbtModelsWithDescriptionMetric"
dbt_models_without_description = "checkup_dbt:DbtModelsWithoutDescriptionMetric"
dbt_columns_with_description = "checkup_dbt:DbtColumnsWithDescriptionMetric"
dbt_columns_without_description = "checkup_dbt:DbtColumnsWithoutDescriptionMetric"
dbt_unit_tests = "checkup_dbt:DbtUnitTestsMetric"
dbt_data_tests = "checkup_dbt:DbtDataTestsMetric"
dbt_column_tests = "checkup_dbt:DbtColumnTestsMetric"
dbt_tested_columns = "checkup_dbt:DbtTestedColumnsMetric"
dbt_column_test_coverage = "checkup_dbt:DbtColumnTestCoverageMetric"
dbt_output_models = "checkup_dbt:DbtOutputModelsMetric"
dbt_output_models_with_description = "checkup_dbt:DbtOutputModelsWithDescriptionMetric"
dbt_output_models_without_description = "checkup_dbt:DbtOutputModelsWithoutDescriptionMetric"
dbt_output_models_without_contracts = "checkup_dbt:DbtOutputModelsWithoutContractsMetric"
dbt_output_columns_without_data_type = "checkup_dbt:DbtOutputColumnsWithoutDataTypeMetric"
dbt_flagged_packages = "checkup_dbt:DbtFlaggedPackagesMetric"
dbt_profile_host = "checkup_dbt:DbtProfileHostMetric"
dbt_models_not_adhering_to_naming_convention = "checkup_dbt:DbtModelsNotAdheringToNamingConventionMetric"
dbt_supported_version = "checkup_dbt:DbtSupportedVersionMetric"
dbt_version = "checkup_dbt:DbtVersionMetric"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
7 changes: 7 additions & 0 deletions plugins/checkup-git/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
git = "checkup_git:GitProvider"

[project.entry-points."checkup.metrics"]
git_days_since_last_update = "checkup_git:GitDaysSinceLastUpdateMetric"
git_tracked_file_count = "checkup_git:GitTrackedFileCountMetric"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
3 changes: 3 additions & 0 deletions plugins/checkup-github/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
github = "checkup_github:GitHubProvider"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
3 changes: 3 additions & 0 deletions plugins/checkup-gitlab/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ dev = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.providers"]
gitlab = "checkup_gitlab:GitLabProvider"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
4 changes: 4 additions & 0 deletions plugins/checkup-python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ dependencies = [
[tool.uv.sources]
checkup = { workspace = true }

[project.entry-points."checkup.metrics"]
python_version = "checkup_python.metrics:PythonVersionMetric"
python_version_check = "checkup_python.metrics:PythonVersionCheckMetric"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from checkup_python.metrics.version import PythonVersionMetric
from checkup_python.metrics.version_check import PythonVersionCheckMetric

__all__ = ["PythonVersionMetric"]
__all__ = ["PythonVersionMetric", "PythonVersionCheckMetric"]
8 changes: 8 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,21 @@ dependencies = [
"jinja2>=3.1.6",
"pydantic>=2.11.7",
"pyyaml>=6.0",
"questionary>=2.0",
"rich>=13.0",
"sqlalchemy>=2.0",
"typer>=0.24",
]

[project.scripts]
checkup = "checkup:main"

[project.entry-points."checkup.materializers"]
console = "checkup.materializers:ConsoleMaterializer"
csv = "checkup.materializers:CSVMaterializer"
html = "checkup.materializers:HTMLMaterializer"
sqlalchemy = "checkup.materializers:SQLAlchemyMaterializer"

[build-system]
requires = ["uv_build>=0.8.13,<0.9.0"]
build-backend = "uv_build"
Expand Down
8 changes: 4 additions & 4 deletions src/checkup/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Checkup - Extensible metrics calculation framework."""
"""Checkup - Computational governance framework for measuring data product health."""

from checkup.errors import (
DuplicateMetricNameError,
Expand Down Expand Up @@ -49,6 +49,6 @@


def main() -> None:
"""CLI entry point."""
print("Checkup metrics framework")
print("Import CheckHub to get started")
from checkup.cli import app

app()
18 changes: 18 additions & 0 deletions src/checkup/cli/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"""
Checkup CLI application.
"""

import typer

from checkup.cli.commands import config, init, run, schema

app = typer.Typer(
name="checkup",
help="CheckUp - Computational governance framework for measuring data product health",
no_args_is_help=True,
)

app.command()(run)
app.command()(init)
app.command()(config)
app.command()(schema)
15 changes: 15 additions & 0 deletions src/checkup/cli/commands/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
"""
CLI commands.
"""

from checkup.cli.commands.config import config
from checkup.cli.commands.init import init
from checkup.cli.commands.run import run
from checkup.cli.commands.schema import schema

__all__ = [
"config",
"init",
"run",
"schema",
]
23 changes: 23 additions & 0 deletions src/checkup/cli/commands/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
Config command. Modify an existing config file.
"""

from pathlib import Path
from typing import Annotated

import typer

from checkup.cli.config_wizard import edit_config


def config(
config_path: Annotated[
Path | None,
typer.Option("--config", "-c", help="Path to config file"),
] = None,
) -> None:
"""
Modify the checkup.yaml config file.
"""

edit_config(config_path=config_path)
23 changes: 23 additions & 0 deletions src/checkup/cli/commands/init.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""
Init command. Create a new config file.
"""

from pathlib import Path
from typing import Annotated

import typer

from checkup.cli.config_wizard import create_config


def init(
output: Annotated[
Path | None,
typer.Option("--output", "-o", help="Output path for config file"),
] = None,
) -> None:
"""
Create a checkup.yaml config file.
"""

create_config(output_path=output)
58 changes: 58 additions & 0 deletions src/checkup/cli/commands/run.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
"""
Run command. Run metrics and materialize results.
"""

import logging
from pathlib import Path
from typing import Annotated

import typer

from checkup.cli.executor import execute_checkup
from checkup.cli.utils import apply_cli_overrides
from checkup.configuration import load_config


def run(
config: Annotated[
Path | None,
typer.Option("--config", "-c", help="Path to config file"),
] = None,
tag: Annotated[
list[str] | None,
typer.Option("--tag", "-t", help="Set tags (key=value)"),
] = None,
provider: Annotated[
list[str] | None,
typer.Option("--provider", "-p", help="Set providers (name or name:key=value)"),
] = None,
metric: Annotated[
list[str] | None,
typer.Option("--metric", "-m", help="Set metrics (name or name:key=value)"),
] = None,
materializer: Annotated[
str | None,
typer.Option(
"--materializer", help="Set materializer (type or type:key=value)"
),
] = None,
dry_run: Annotated[
bool,
typer.Option("--dry-run", help="Don't materialize, just print"),
] = False,
verbose: Annotated[
bool,
typer.Option("--verbose", "-v", help="Verbose output"),
] = False,
) -> None:
"""
Run metrics and materialize results.
"""

if verbose:
logging.basicConfig(level=logging.DEBUG)

cfg = load_config(config_path=config)
cfg = apply_cli_overrides(cfg, tag, provider, metric)

execute_checkup(cfg, materializer="console" if dry_run else materializer)
29 changes: 29 additions & 0 deletions src/checkup/cli/commands/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"""
Schema command. Generate JSON schema for checkup.yaml.
"""

from pathlib import Path
from typing import Annotated

import typer
from rich.console import Console

from checkup.configuration.io import SCHEMA_FILENAME
from checkup.configuration.schema import write_schema

console = Console()


def schema(
output: Annotated[
Path | None,
typer.Option("--output", "-o", help="Output path for schema file"),
] = None,
) -> None:
"""
Generate JSON schema for checkup.yaml.
"""

path = output or Path.cwd() / SCHEMA_FILENAME
write_schema(path)
console.print(f"[green]Schema written to {path}[/green]")
8 changes: 8 additions & 0 deletions src/checkup/cli/config_wizard/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""
Interactive config generation and editing.
"""

from .create import create_config
from .edit import edit_config

__all__ = ["create_config", "edit_config"]
Loading
Loading