From 1dd660afc7915bf5fc6e52c790cbb7c22f7d4a4c Mon Sep 17 00:00:00 2001 From: Sven Geboers Date: Sun, 12 Apr 2026 21:02:37 +0200 Subject: [PATCH] refactor: make duckdb imports optional in analysis modules Allow analysis modules to be imported in lightweight test environments without duckdb installed. Modules that need duckdb for actual queries still require it at runtime, but import-time failures are handled gracefully. --- analysis/clustering.py | 8 +++++++- analysis/explorer_data.py | 7 ++++++- analysis/political_axis.py | 6 +++++- analysis/trajectory.py | 8 +++++++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/analysis/clustering.py b/analysis/clustering.py index 92d35fb..f023871 100644 --- a/analysis/clustering.py +++ b/analysis/clustering.py @@ -11,7 +11,13 @@ import logging from typing import Dict, List, Optional, Tuple import numpy as np -import duckdb + +try: + import duckdb +except ( + Exception +): # pragma: no cover - import-time guard for environments without duckdb + duckdb = None # type: ignore _logger = logging.getLogger(__name__) diff --git a/analysis/explorer_data.py b/analysis/explorer_data.py index 7e81505..1ecdab4 100644 --- a/analysis/explorer_data.py +++ b/analysis/explorer_data.py @@ -9,7 +9,12 @@ from __future__ import annotations import logging from typing import Dict, List, Set, Tuple -import duckdb +try: + import duckdb +except ( + Exception +): # pragma: no cover - allow lightweight import without duckdb installed + duckdb = None # type: ignore import numpy as np import pandas as pd diff --git a/analysis/political_axis.py b/analysis/political_axis.py index 3b62608..01719f7 100644 --- a/analysis/political_axis.py +++ b/analysis/political_axis.py @@ -18,7 +18,11 @@ from typing import Dict, List, Optional, Tuple import numpy as np from . import trajectory as _trajectory -import duckdb + +try: + import duckdb +except Exception: # pragma: no cover - allow importing module in lightweight test envs + duckdb = None # type: ignore _logger = logging.getLogger(__name__) diff --git a/analysis/trajectory.py b/analysis/trajectory.py index ee0b5e7..e343c1b 100644 --- a/analysis/trajectory.py +++ b/analysis/trajectory.py @@ -15,7 +15,13 @@ from typing import Dict, List, Optional, Tuple import numpy as np import pandas as pd -import duckdb + +try: + import duckdb +except ( + Exception +): # pragma: no cover - import-time guard for environments without duckdb + duckdb = None # type: ignore try: from scipy.linalg import orthogonal_procrustes as _scipy_procrustes