chore: project review (dev tools in extras, dep upgrades, optional-deps guard, stale cleanup)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Victor Kuznetsov
2026-06-09 17:03:17 -07:00
co-authored by Claude Fable 5
parent 826cfdb82a
commit 295e7ada2b
15 changed files with 784 additions and 304 deletions
+28
View File
@@ -0,0 +1,28 @@
"""Shared availability guard for optional dependencies.
A bare ``importlib.util.find_spec(name) is not None`` check lies when only a
leftover data directory exists in site-packages: e.g. ``trustmark`` downloads
model weights into its own package dir, so after the package is uninstalled
(``uv sync`` pruning an extra) a ``trustmark/models/`` remnant survives and
``find_spec`` resolves it to a namespace-package spec (``loader is None``)
while the actual import fails. Every ``is_available()`` guard routes through
``module_available`` so a pure namespace package counts as absent.
"""
from __future__ import annotations
import importlib.util
def module_available(*names: str) -> bool:
"""True when every named module resolves to a real, importable package.
A spec with ``loader is None`` is a pure namespace package -- for our
optional deps that means a stale directory remnant, not an installed
package -- so it is treated as not available.
"""
for name in names:
spec = importlib.util.find_spec(name)
if spec is None or spec.loader is None:
return False
return True