1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
17 LOG = logging.getLogger(__name__)
21 # convert object to a dict
22 dic = {'__class__': obj.__class__.__name__, '__module__': obj.__module__}
23 dic.update(obj.__dict__)
28 # convert dict to object
29 if '__class__' in dic:
30 class_name = dic.pop('__class__')
31 module_name = dic.pop('__module__')
32 module = __import__(module_name)
33 class_ = getattr(module, class_name)
34 args = dict((key.encode('ascii'), value) for key, value in dic.items()) # get args
35 inst = class_(**args) # create new instance
41 def filter_comments(filename, flags="//"):
43 with open(filename, "r") as ifile:
44 lines = ifile.readlines()
46 data = re.sub("%s.*$" % (flags), '', data)
47 data = re.sub("^\s*$", '', data)
51 return ''.join(result)
54 class BaseSettings(object):
55 def _load(self, fullname):
56 data = filter_comments(fullname)
61 jparams = json.loads(data)
64 def _sub(self, ldata, rdata):
65 if isinstance(ldata, list) and isinstance(rdata, list):
71 if isinstance(litem, dict) or isinstance(litem, list):
72 tmp = self._sub(litem, ritem)
75 if tmp and tmp not in data:
83 elif isinstance(ldata, dict) and isinstance(rdata, dict):
85 rdata_bak = copy.deepcopy(rdata)
86 for rkey, rvalue in rdata_bak.items():
89 for lkey, lvalue in ldata.items():
91 if isinstance(lvalue, dict) or isinstance(lvalue, list):
92 data[lkey] = self._sub(lvalue, rdata[lkey])
94 data[lkey] = rdata[lkey]
103 def _save(self, data, filename):
104 if os.path.exists(filename):
106 with open(filename, 'w') as ofile:
107 content = json.dumps(data, sort_keys=True, indent=4, separators=(',', ':'))
111 class DefaultSettings(BaseSettings):
112 def __init__(self, path):
113 self._default = os.path.join(path, 'default')
114 self._user = os.path.join(path, 'user')
116 def load(self, filename):
117 dfile = os.path.join(self._default, filename)
118 if os.path.exists(dfile):
119 ddata = self._load(dfile)
122 err = "default file is missing : %s" % (dfile)
125 ufile = os.path.join(self._user, filename)
126 if os.path.exists(ufile):
127 udata = self._load(ufile)
129 data = self._sub(ddata, udata)
131 LOG.info("no user file :%s" % (ufile))
134 def save(self, data, filename):
135 ufile = os.path.join(self._user, filename)
136 self._save(data, ufile)
139 class SingleSettings(BaseSettings):
140 def __init__(self, path):
143 def load(self, filename):
144 pfile = os.path.join(self._path, filename)
145 if os.path.exists(pfile):
146 ddata = self._load(pfile)
149 err = "settings file is missing : %s" % (pfile)
154 def save(self, data, filename):
155 pfile = os.path.join(self._path, filename)
156 self._save(data, pfile)
158 SETS_DEFAULT = "Default"
159 SETS_SINGLE = "Single"
160 SETTINGS = [SETS_SINGLE, SETS_DEFAULT]
163 class Settings(object):
164 def __init__(self, path, filename, mode=SETS_SINGLE):
165 if mode not in SETTINGS:
166 raise Exception("error Settings mode : %s" % (mode))
167 cls_name = mode + "Settings"
168 thismodule = sys.modules[__name__]
169 cls = getattr(thismodule, cls_name)
170 self._settings = cls(path)
171 self._filename = filename
172 self._fset = self._settings.load(filename)
173 self._mset = copy.deepcopy(self._fset)
174 self._register_func()
177 self._fset = self._settings.load(self._filename)
178 self._mset = copy.deepcopy(self._fset)
184 def _setting_file(self, func_name, mset, fset, key, check=None):
186 if hasattr(check, '__call__'):
188 if isinstance(fset, dict):
189 mset[key] = copy.deepcopy(value)
190 fset[key] = copy.deepcopy(value)
191 elif isinstance(fset, list):
194 mset.extend(copy.deepcopy(value))
195 fset.extend(copy.deepcopy(value))
196 self._settings.save(self._fset, self._filename)
197 infunc.__name__ = func_name
198 LOG.debug(self._mset)
199 LOG.debug(self._fset)
203 def _setting_memory(self, func_name, mset, key, check=None):
205 if hasattr(check, '__call__'):
207 if isinstance(mset, dict):
208 mset[key] = copy.deepcopy(value)
209 elif isinstance(mset, list):
210 for i in range(len(mset)):
212 mset.extend(copy.deepcopy(value))
214 infunc.__name__ = func_name
215 LOG.debug(self._mset)
216 LOG.debug(self._fset)
220 def _adding_file(self, func_name, mset, fset, key, check=None):
222 if hasattr(check, '__call__'):
225 mset[key].append(copy.deepcopy(value))
226 fset[key].append(copy.deepcopy(value))
228 mset.append(copy.deepcopy(value))
229 fset.append(copy.deepcopy(value))
231 self._settings.save(self._fset, self._filename)
232 infunc.__name__ = func_name
233 LOG.debug(self._mset)
234 LOG.debug(self._fset)
238 def _adding_memory(self, func_name, mset, key, check=None):
240 if hasattr(check, '__call__'):
243 mset[key].append(copy.deepcopy(value))
245 mset.append(copy.deepcopy(value))
246 infunc.__name__ = func_name
247 LOG.debug(self._mset)
248 LOG.debug(self._fset)
252 def _register_func(self):
253 if isinstance(self._fset, dict):
259 func_name = "set_%s" % item
260 setattr(self, func_name, self._setting_file(func_name, self._mset, self._fset, item))
261 func_name = "mset_%s" % item
262 setattr(self, func_name, self._setting_memory(func_name, self._mset, item))
263 elif isinstance(self._fset, list):
265 setattr(self, func_name, self._setting_file(func_name, self._mset, self._fset, None))
267 setattr(self, func_name, self._setting_memory(func_name, self._mset, None))
269 setattr(self, func_name, self._adding_file(func_name, self._mset, self._fset, None))
271 setattr(self, func_name, self._adding_memory(func_name, self._mset, None))
275 from vstf.common.log import setup_logging
276 setup_logging(level=logging.DEBUG, log_file="/var/log/vstf-settings.log", clevel=logging.INFO)
279 setting = DefaultSettings(path)
280 filename = 'reporters.mail.mail-settings'
281 data = setting.load(filename)
283 setting.save(data, filename)
288 if __name__ == '__main__':