import collections
from pathlib import Path, PurePath
import sys
import os
import json
[docs]def as_dict(par):
if not par:
return None
if isinstance(par, dict):
return par
else:
return dict(par._asdict())
[docs]def from_dict(par_dict):
if not par_dict:
return None
# par = collections.namedtuple('Params', par_dict.keys())(**par_dict)
par = collections.namedtuple('Params', par_dict.keys())
class IBLParams(par):
def set(self, field, value):
d = as_dict(self)
d[field] = value
return from_dict(d)
def as_dict(self):
return as_dict(self)
return IBLParams(**par_dict)
[docs]def getfile(str_params):
"""
Returns full path of the param file per system convention:
linux/mac: ~/.str_params, Windows: APPDATA folder
:param str_params: string that identifies parm file
:return: string of full path
"""
# strips already existing dot if any
parts = ['.' + p if not p.startswith('.') else p for p in Path(str_params).parts]
if sys.platform == 'win32' or sys.platform == 'cygwin':
pfile = str(PurePath(os.environ['APPDATA'], *parts))
else:
pfile = str(PurePath(Path.home(), *parts))
return pfile
[docs]def read(str_params, default=None):
"""
Reads in and parse Json parameter file into dictionary
:param str_params: path to text json file
:param default: default values for missing parameters
:return: named tuple containing parameters
"""
pfile = getfile(str_params)
if Path(pfile).exists():
with open(pfile) as fil:
par_dict = json.loads(fil.read())
else:
par_dict = as_dict(default)
# without default parameters
default = as_dict(default)
# TODO : behaviour for non existing file
# tat = params.read('rijafa', default={'toto': 'titi', 'tata': 1})
if not default or default.keys() == par_dict.keys():
return from_dict(par_dict)
# if default parameters bring in a new parameter
new_keys = set(default.keys()).difference(set(par_dict.keys()))
for nk in new_keys:
par_dict[nk] = default[nk]
# write the new parameter file with the extra param
write(str_params, par_dict)
return from_dict(par_dict)
[docs]def write(str_params, par):
"""
Write a parameter file in Json format
:param str_params: path to text json file
:param par: dictionary containing parameters values
:return: None
"""
pfile = getfile(str_params)
dpar = as_dict(par)
for k in dpar:
if isinstance(dpar[k], Path):
dpar[k] = str(dpar[k])
with open(pfile, 'w') as fil:
json.dump(as_dict(par), fil, sort_keys=False, indent=4)