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
14 changes: 4 additions & 10 deletions plugins/checkup-conveyor/src/checkup_conveyor/conveyor_metric.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import requests

from checkup import Context
from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup_conveyor import ConveyorMetric

logger = logging.getLogger(__name__)
Expand All @@ -15,9 +15,7 @@ class ConveyorLastDeploymentTime(ConveyorMetric):
description: ClassVar[str] = "Time of the last deployment in Conveyor"
unit: ClassVar[str] = "timestamp"

def calculate(
self, context: Context, measurements: dict[type[Metric], Measurement]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
proj_id = self.get_conveyor_project_id(context)
if proj_id is None:
return self.measure(value=None)
Expand All @@ -40,9 +38,7 @@ class ConveyorIsDirtyDeployment(ConveyorMetric):
description: ClassVar[str] = "True if the last deployment was dirty"
unit: ClassVar[str] = "boolean"

def calculate(
self, context: Context, measurements: dict[type[Metric], Measurement]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
proj_id = self.get_conveyor_project_id(context)
if proj_id is None:
return self.measure(value=None)
Expand All @@ -66,9 +62,7 @@ class ConveyorLastRunStatus(ConveyorMetric):
description: ClassVar[str] = "Status of the last run in Conveyor"
unit: ClassVar[str] = "string"

def calculate(
self, context: Context, measurements: dict[type[Metric], Measurement]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
proj_id = self.get_conveyor_project_id(context)
if proj_id is None:
return self.measure(value=None)
Expand Down
11 changes: 4 additions & 7 deletions plugins/checkup-dbt/src/checkup_dbt/metrics/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
from dbt.artifacts.resources.types import NodeType
from dbt.contracts.graph.manifest import Manifest

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.provider import Provider
from checkup.types import Context
from checkup_dbt.manifest_query import ManifestQuery
Expand Down Expand Up @@ -87,9 +88,7 @@ class DbtCountMetric(DbtMetric):
predicate: ClassVar[Callable[..., bool] | None] = None
log_message: ClassVar[str] = "Found {value} items"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
cls = type(self)
query = self.query(context).filter_by_type(cls.resource_type)

Expand Down Expand Up @@ -128,9 +127,7 @@ class DbtDiagnosticMetric(DbtMetric):
log_message: ClassVar[str] = "Found {value} items"
max_diagnostic_items: ClassVar[int] = 50

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
cls = type(self)
query = self.query(context).filter_by_type(cls.resource_type)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import yaml

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric

Expand Down Expand Up @@ -31,9 +31,7 @@ class DbtFlaggedPackagesMetric(DbtMetric):

flagged_packages: list[str]

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
project_dir = self.get_project_dir(context)
packages_path = project_dir / "packages.yml"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from dbt.artifacts.resources.types import NodeType

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric, NamingConventionChecker

Expand All @@ -28,9 +28,7 @@ class DbtModelsNotAdheringToNamingConventionMetric(DbtMetric):

checker: NamingConventionChecker

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
manifest = self.get_manifest(context)

non_adhering_models = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import yaml

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric

Expand Down Expand Up @@ -37,9 +37,7 @@ class DbtProfileHostMetric(DbtMetric):
profile: str | None = None
target: str

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
project_dir = self.get_project_dir(context)
profiles_path = project_dir / "profiles.yml"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric
from checkup_dbt.metrics.quality.version import DbtVersionMetric
Expand All @@ -23,10 +24,8 @@ class DbtSupportedVersionMetric(DbtMetric):
def depends_on(cls) -> list[type[Metric]]:
return [DbtVersionMetric]

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
version: str = self.get_single(measurements, DbtVersionMetric).value
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
version: str = measurements.get(DbtVersionMetric).value

major_version = int(version.split(".")[0])
minor_version = int(version.split(".")[1])
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import logging

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric

Expand All @@ -18,9 +18,7 @@ class DbtVersionMetric(DbtMetric):
description: str = "The dbt version used to generate the manifest"
unit: str = "version"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
manifest = self.get_manifest(context)
value = manifest.metadata.dbt_version
return self.measure(value=value, diagnostic=f"dbt version: {value}")
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric
from checkup_dbt.metrics.core.columns import DbtColumnsMetric
Expand All @@ -25,11 +26,9 @@ class DbtColumnTestCoverageMetric(DbtMetric):
def depends_on(cls) -> list[type[Metric]]:
return [DbtTestedColumnsMetric, DbtColumnsMetric]

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
tested = self.get_single(measurements, DbtTestedColumnsMetric).value
total = self.get_single(measurements, DbtColumnsMetric).value
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
tested = measurements.get(DbtTestedColumnsMetric).value
total = measurements.get(DbtColumnsMetric).value

if total > 0:
value = int(tested / total * 100)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from dbt.artifacts.resources.types import NodeType

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.types import Context
from checkup_dbt.metrics.base import DbtMetric

Expand All @@ -20,9 +20,7 @@ class DbtTestedColumnsMetric(DbtMetric):
description: str = "Number of columns with at least one test"
unit: str = "columns"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
manifest = self.get_manifest(context)

all_columns = {
Expand Down
11 changes: 4 additions & 7 deletions plugins/checkup-git/src/checkup_git/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
from datetime import UTC, datetime
from fnmatch import fnmatch

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.provider import Provider
from checkup.types import Context
from checkup_git.provider import GitProvider
Expand All @@ -28,9 +29,7 @@ class GitDaysSinceLastUpdateMetric(GitMetric):
description: str = "Days since the last git commit"
unit: str = "days"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
git_context = self.get_context(context)
last_commit_date = git_context.get("git_last_commit_date")

Expand Down Expand Up @@ -67,9 +66,7 @@ class GitTrackedFileCountMetric(GitMetric):

pattern: str = "*"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
git_context = self.get_context(context)
tracked_files = git_context.get("git_tracked_files", [])

Expand Down
7 changes: 3 additions & 4 deletions plugins/checkup-python/src/checkup_python/metrics/version.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
import sys
from pathlib import Path

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.types import Context


Expand All @@ -20,9 +21,7 @@ class PythonVersionMetric(Metric):
description: str = "The Python version configured for the project"
unit: str = "version"

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
path = None

if "path" in context:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.types import Context
from checkup_python.metrics.utils import parse_semantic_version
from checkup_python.metrics.version import PythonVersionMetric
Expand All @@ -21,10 +22,8 @@ class PythonVersionCheckMetric(Metric):
def depends_on(cls) -> list[type[Metric]]:
return [PythonVersionMetric]

def calculate(
self, context: Context, measurements: dict[type[Metric], list[Measurement]]
) -> Measurement:
actual_version = self.get_single(measurements, PythonVersionMetric).value
def calculate(self, context: Context, measurements: Measurements) -> Measurement:
actual_version = measurements.get(PythonVersionMetric).value

actual = parse_semantic_version(actual_version)
min_ver = parse_semantic_version(self.min_version)
Expand Down
7 changes: 6 additions & 1 deletion src/checkup/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,23 @@
Materializer,
SQLAlchemyMaterializer,
)
from checkup.metric import ExecutorType, Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import ExecutorType, Metric
from checkup.provider import Provider
from checkup.providers.tags import TagProvider
from checkup.types import Context
from checkup.utils import suppress_subprocess_output

# Rebuild models to resolve forward references after all classes are imported
Measurement.model_rebuild()

__all__ = [
# Core
"CheckHub",
"MeasurementResult",
"Metric",
"Measurement",
"Measurements",
"ExecutorType",
"Provider",
"TagProvider",
Expand Down
17 changes: 9 additions & 8 deletions src/checkup/executor/batch_executors.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor, as_completed
from typing import Any

from checkup.metric import Measurement, Metric
from checkup.measurement import Measurement, Measurements
from checkup.metric import Metric
from checkup.types import Context
from checkup.validators import validate_pickleable

Expand All @@ -17,7 +18,7 @@ def _calculate_metric_in_process(
metric: Metric,
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> Measurement:
"""
Calculate a single metric in a subprocess.
Expand All @@ -34,7 +35,7 @@ def execute_batch_thread(
batch: list[Metric],
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> list[tuple[Metric, Measurement]]:
"""
Execute metrics using ThreadPoolExecutor.
Expand Down Expand Up @@ -66,7 +67,7 @@ def execute_batch_process(
batch: list[Metric],
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> list[tuple[Metric, Measurement]]:
"""
Execute metrics using ProcessPoolExecutor.
Expand Down Expand Up @@ -109,7 +110,7 @@ def execute_batch_asyncio(
batch: list[Metric],
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> list[tuple[Metric, Measurement]]:
"""
Execute metrics using asyncio.
Expand All @@ -122,7 +123,7 @@ async def _execute_batch_asyncio_impl(
batch: list[Metric],
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> list[tuple[Metric, Measurement]]:
"""
Async implementation of batch execution.
Expand All @@ -139,7 +140,7 @@ async def _calculate_async_metric(
metric: Metric,
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> Measurement:
"""
Calculate a single metric, handling both sync and async calculate methods.
Expand All @@ -157,7 +158,7 @@ def _calculate_single_metric(
metric: Metric,
context: Context,
tags: dict[str, Any],
calculated: dict[type[Metric], list[Measurement]],
calculated: Measurements,
) -> Measurement:
"""
Calculate a single metric (for thread executor).
Expand Down
Loading