[030aeb]: / dosma / utils / env.py

Download this file

151 lines (108 with data), 4.3 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
import logging
import os
from importlib import util
_SUPPORTED_PACKAGES = {}
_FILE_DIRECTORY = os.path.abspath(os.path.dirname(__file__))
__all__ = ["debug", "get_version", "package_available"]
def package_available(name: str):
"""Returns if package is available.
Args:
name (str): Name of the package.
Returns:
bool: Whether module exists in environment.
"""
global _SUPPORTED_PACKAGES
if name not in _SUPPORTED_PACKAGES:
_SUPPORTED_PACKAGES[name] = util.find_spec(name) is not None
return _SUPPORTED_PACKAGES[name]
def get_version(package_or_name) -> str:
"""Returns package version.
Args:
package_or_name (``module`` or ``str``): Module or name of module.
This package must have the version accessible through ``<module>.__version__``.
Returns:
str: The package version.
Examples:
>>> get_version("numpy")
"1.20.0"
"""
if isinstance(package_or_name, str):
if not package_available(package_or_name):
raise ValueError(f"Package {package_or_name} not available")
spec = util.find_spec(package_or_name)
package_or_name = util.module_from_spec(spec)
spec.loader.exec_module(package_or_name)
version = package_or_name.__version__
return version
def debug(value: bool = None) -> bool:
"""Return (and optionally set) debug mode.
Args:
value (bool, optional): If specified, sets the debug status.
If not specified, debug mode is not set, only returned.
Returns:
bool: If ``True``, debug mode is active.
Raises:
ValueError: If ``value`` is not a supported value.
Note:
Changing the debug state changes the stream handler logging level
for the default dosma logger. If debug state is turned off, logging
level is set to ``logging.INFO``. If debug state is turned on,
logging level is set to ``logging.DEBUG``.
Examples:
>>> debug() # get debug status, defaults to False
False
>>> debug(True) # turn on debug mode
True
>>> debug() # get debug status
True
"""
def _is_debug():
return os.environ.get("DOSMA_DEBUG", "") in ["True", "true"]
def _toggle_debug(_old_value, _new_value):
from dosma.defaults import preferences
# TODO: Toggle dosma logging to debug mode.
if _old_value == _new_value:
return
_dm_logger = logging.getLogger("dosma")
if _new_value:
preferences.set("nipype", value="stream", prefix="logging")
_dm_logger.setLevel(logging.DEBUG)
for h in _dm_logger.handlers:
h.setLevel(logging.DEBUG)
else:
preferences.set("nipype", value="file_stderr", prefix="logging")
_dm_logger.setLevel(logging.DEBUG) # the root logger should always log at DEBUG level
for h in _dm_logger.handlers:
if isinstance(h, logging.StreamHandler):
h.setLevel(logging.INFO)
if value is not None:
old_value = _is_debug()
if isinstance(value, bool):
os.environ["DOSMA_DEBUG"] = str(value)
elif isinstance(value, str) and value.lower() in ("true", "false", ""):
os.environ["DOSMA_DEBUG"] = value
else:
raise ValueError(f"Unknown value for debug: '{value}'")
_toggle_debug(old_value, _is_debug())
return _is_debug()
def sitk_available():
return package_available("SimpleITK")
def cupy_available():
if "cupy" not in _SUPPORTED_PACKAGES:
try:
import cupy # noqa
except ImportError:
_SUPPORTED_PACKAGES["cupy"] = False
return package_available("cupy")
def sigpy_available():
return package_available("sigpy")
def torch_available():
return package_available("torch")
def resources_dir() -> str:
return os.path.abspath(os.path.join(_FILE_DIRECTORY, "../resources"))
def output_dir() -> str:
return os.path.abspath(os.path.join(_FILE_DIRECTORY, "../../.dosma"))
def temp_dir() -> str:
return os.path.join(output_dir(), "temp")
def log_file_path() -> str:
return os.path.join(output_dir(), "dosma.log")