119 lines
3.7 KiB
Python
119 lines
3.7 KiB
Python
# coding: utf-8
|
|
"""
|
|
Module config
|
|
=============
|
|
|
|
"""
|
|
|
|
from configparser import NoSectionError
|
|
from configparser import SafeConfigParser as ConfigParser
|
|
import os
|
|
import sys
|
|
import fnmatch
|
|
from msspec.misc import LOGGER
|
|
|
|
|
|
class NoConfigFile(Exception): pass
|
|
|
|
|
|
class Config(object):
|
|
def __init__(self, **kwargs):
|
|
self.fname = os.path.join(os.environ['HOME'], '.config/msspec/pymsspec.cfg')
|
|
self.version = sys.modules['msspec'].__version__
|
|
self.config = ConfigParser()
|
|
self.defaults = {'path': 'None'}
|
|
self.defaults.update(kwargs)
|
|
|
|
# try to load the config file, create one with defaults if none is found
|
|
try:
|
|
self.options = self.read()
|
|
self.options.update(kwargs)
|
|
self.set(**self.options)
|
|
self.write()
|
|
except NoConfigFile:
|
|
# write a file with default options
|
|
self.write(defaults=True)
|
|
except NoSectionError:
|
|
# the file exists but has no options for this version of pymsspec
|
|
self.config.add_section(self.version)
|
|
self.set(**self.defaults)
|
|
self.write()
|
|
|
|
def read(self):
|
|
fp = self.config.read(self.fname)
|
|
if len(fp) == 0:
|
|
raise NoConfigFile
|
|
self.version = self.config.get('general', 'version')
|
|
return dict(self.config.items(self.version))
|
|
|
|
def set(self, **kwargs):
|
|
if not(self.config.has_section(self.version)):
|
|
self.config.add_section(self.version)
|
|
for k, v in list(kwargs.items()):
|
|
self.config.set(self.version, k, v)
|
|
|
|
def get(self, key):
|
|
return self.config.get(self.version, key)
|
|
|
|
def choose_msspec_folder(self, *folders):
|
|
print("Several folders containing the appropriate version of MsSpec were found.")
|
|
print("Please choose one tu use:")
|
|
s = ""
|
|
for i, f in enumerate(folders):
|
|
s += '{:d}) {:s}\n'.format(i, f)
|
|
print(s)
|
|
return(folders[int(input('Your choice: '))])
|
|
|
|
def find_msspec_folders(self):
|
|
version = sys.modules['msspec'].__version__
|
|
folders = []
|
|
i = 0
|
|
prompt = 'Please wait while scanning the filesystem (%3d found) '
|
|
sys.stdout.write(prompt % len(folders))
|
|
sys.stdout.write('\033[s')
|
|
|
|
for root, dirnames, filenames in os.walk('/home/stricot'):
|
|
sys.stdout.write('\033[u\033[k')
|
|
sys.stdout.write('%d folders scanned' % i)
|
|
i += 1
|
|
for fn in fnmatch.filter(filenames, 'VERSION'):
|
|
with open(os.path.join(root, fn), 'r') as fd:
|
|
try:
|
|
line = fd.readline()
|
|
if line.strip() == version:
|
|
folders.append(root)
|
|
sys.stdout.write('\033[2000D\033[k')
|
|
sys.stdout.write(prompt % len(folders))
|
|
except:
|
|
pass
|
|
sys.stdout.write('\033[u\033[k\n')
|
|
print('Done.')
|
|
return(folders)
|
|
|
|
|
|
def write(self, defaults=False):
|
|
if defaults:
|
|
self.set(**self.defaults)
|
|
|
|
with open(self.fname, 'w') as fd:
|
|
self.config.write(fd)
|
|
LOGGER.info("{} file written".format(self.fname))
|
|
|
|
def set_mode(self, mode="pymsspec"):
|
|
if not(self.config.has_section("general")):
|
|
self.config.add_section("general")
|
|
self.config.set("general", "mode", str(mode))
|
|
|
|
def get_mode(self):
|
|
return self.config.get("general", "mode")
|
|
|
|
def set_version(self, version=""):
|
|
if not(self.config.has_section("general")):
|
|
self.config.add_section("general")
|
|
self.config.set("general", "version", version)
|
|
|
|
def remove_version(self, version):
|
|
pass
|
|
|
|
|