Source code for niftynet.utilities.niftynet_global_config
# -*- coding: utf-8 -*-
"""
NiftyNet user folder configuration
"""
import sys
from random import choice
from string import ascii_lowercase
from time import strftime
import os
from os.path import expanduser, join, split, isdir, isfile, splitext
# pylint: disable=wrong-import-order
try:
from configparser import (ConfigParser, Error)
except ImportError:
from ConfigParser import (ConfigParser, Error)
from niftynet.utilities.decorators import singleton
CONFIG_HOME_VAR = 'niftynet_config_home'
MODEL_ZOO_VAR = 'niftynet_model_zoo'
# SERVER_URL = 'https://cmiclab.cs.ucl.ac.uk/CMIC/NiftyNetExampleServer'
SERVER_URL = 'https://github.com/NifTK/NiftyNetModelZoo'
[docs]@singleton
class NiftyNetGlobalConfig(object):
"""Global configuration settings"""
global_section = 'global'
home_key = 'home'
niftynet_exts = {'extensions': ['network']}
def __init__(self):
self._download_server_url = SERVER_URL
self._config_home = join(expanduser('~'), '.niftynet')
try:
if os.environ[MODEL_ZOO_VAR]:
self._download_server_url = os.environ[MODEL_ZOO_VAR]
except KeyError:
pass
try:
if os.environ[CONFIG_HOME_VAR]:
self._config_home = os.environ[CONFIG_HOME_VAR]
except KeyError:
pass
self._config_file = join(self._config_home, 'config.ini')
self._niftynet_home = self._config_home
self.setup()
[docs] def setup(self):
"""
Read variables from system environment and make directories.
:return:
"""
config_opts = NiftyNetGlobalConfig.__load_or_create(self._config_file)
self._niftynet_home = expanduser(
config_opts[NiftyNetGlobalConfig.global_section][
NiftyNetGlobalConfig.home_key])
if not isdir(self._niftynet_home):
os.makedirs(self._niftynet_home)
# create folders for user-defined extensions such as new networks
for ext in list(NiftyNetGlobalConfig.niftynet_exts):
extension_subfolder = join(self._niftynet_home, ext)
NiftyNetGlobalConfig.__create_module(extension_subfolder)
for mod in NiftyNetGlobalConfig.niftynet_exts[ext]:
extension_subsubfolder = join(self._niftynet_home, ext, mod)
NiftyNetGlobalConfig.__create_module(extension_subsubfolder)
for ext in list(NiftyNetGlobalConfig.niftynet_exts):
extension_subfolder = join(self._niftynet_home, ext)
sys.path.insert(1, extension_subfolder)
sys.path.insert(1, self._niftynet_home)
return self
@staticmethod
def __create_module(path):
"""Create the passed path, i.e. folder and place an empty
``__init__.py`` file inside.
:param path: assumed not to exist
:type path: `os.path`
"""
os.makedirs(path)
open(join(path, '__init__.py'), 'a').close()
@staticmethod
def __load_or_create(config_file):
"""Load passed configuration file, if it exists; create a default
otherwise. If this method finds an incorrect config file, it
backs the file up with a human-readable timestamp suffix and
creates a default one.
:param config_file: no sanity checks are performed, as this
method is for internal use only
:type config_file: `os.path`
:returns: a dictionary of parsed configuration options
:rtype: `dict`
"""
required_sections = [NiftyNetGlobalConfig.global_section]
required_keys = {
required_sections[0]: [NiftyNetGlobalConfig.home_key]
}
default_values = {
required_sections[0]: {
NiftyNetGlobalConfig.home_key: '~/niftynet'
}
}
backup = False
if isfile(config_file):
try:
config = ConfigParser()
config.read(config_file)
# check all required sections and keys present
for required_section in required_sections:
if required_section not in config:
backup = True
break
for required_key in required_keys[required_section]:
if required_key not in config[required_section]:
backup = True
break
if backup:
break
except Error:
backup = True
if not backup: # loaded file contains all required
# config options: so return
return dict(config)
config_dir, config_filename = split(config_file)
if not isdir(config_dir):
os.makedirs(config_dir)
if backup: # config file exists, but does not contain all required
# config opts: so backup not to override
timestamp = strftime('%Y-%m-%d-%H-%M-%S')
random_str = ''.join(choice(ascii_lowercase) for _ in range(3))
backup_suffix = '-'.join(['backup', timestamp, random_str])
filename, extension = splitext(config_filename)
backup_filename = ''.join([filename, '-', backup_suffix, extension])
backup_file = join(config_dir, backup_filename)
os.rename(config_file, backup_file)
# create a new default global config file
config = ConfigParser(default_values)
for required_section in required_sections:
for required_key in required_keys[required_section]:
config.add_section(required_section)
config[required_section][required_key] = \
default_values[required_section][required_key]
with open(config_file, 'w') as new_config_file:
config.write(new_config_file)
return dict(config)
[docs] def get_niftynet_home_folder(self):
"""Return the folder containing NiftyNet models and data"""
return self._niftynet_home
[docs] def get_niftynet_config_folder(self):
"""Return the folder containing NiftyNet global configuration"""
return self._config_home
[docs] def get_default_examples_folder(self):
"""Return the default folder containing NiftyNet examples"""
return join(self._niftynet_home, 'examples')
[docs] def get_download_server_url(self):
"""Return the URL to the NiftyNet examples server"""
return self._download_server_url