Coverage for packages / dqm-ml / src / dqm_ml / dependency.py: 80%
39 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 10:11 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 10:11 +0000
1"""Dependency management utilities for DQM-ML v2.
3This module provides functions for handling optional dependencies,
4displaying version information, and discovering available commands.
5"""
7from collections.abc import Generator
8from contextlib import contextmanager
9import logging
10from typing import Any
12from dqm_ml_core import PluginLoadedRegistry
13from dqm_ml_core._version_ import version as core_version
15logger = logging.getLogger(__name__)
18@contextmanager
19def optional_dependencies(error: str = "ignore") -> Generator[None, None, None]:
20 """Context manager for handling optional dependencies.
22 Args:
23 error: How to handle missing optional dependencies:
24 - "ignore": Silently continue (default)
25 - "warn": Print a warning message
26 - "raise": Raise the ImportError
28 Yields:
29 None - this is a context manager that doesn't provide any value.
30 """
31 assert error in {"raise", "warn", "ignore"}
32 try:
33 yield None
34 except ImportError as e:
35 if error == "raise":
36 raise e
37 if error == "warn":
38 msg = f'Missing optional dependency "{e.name}". Use pip to install.'
39 print(f"Warning: {msg}")
42def display_version(arg_list: list[str] | None = None) -> None:
43 print(f"DQM-ML version : {core_version}")
46def display_list_of(arg_list: list[str] | None = None) -> None:
47 # TODO : we display all but we can filter / use extra parameters
48 print("Available data metrics_registry")
49 for key, value in PluginLoadedRegistry.get_metrics_registry().items():
50 print(f"- {key} - {value}")
52 print("Available data loaders")
53 for key, value in PluginLoadedRegistry.get_dataloaders_registry().items():
54 print(f"- {key} - {value}")
56 print("Available outputs writers")
57 for key, value in PluginLoadedRegistry.get_outputwriter_registry().items():
58 print(f"- {key} - {value}")
61def get_available_command() -> dict[str, Any]:
62 command_list = {"version": display_version, "list": display_list_of}
63 optional_dep_mode = "warn"
65 # We import available command for dqml cli
66 with optional_dependencies(optional_dep_mode):
67 from dqm_ml_job._version_ import version as pipeline_version
68 from dqm_ml_job.cli import execute
70 logger.debug(f"Different dqm-ml-job version {pipeline_version}")
71 command_list["process"] = execute
73 return command_list