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)
35 for key, value in dic.items()) # get args
36 inst = class_(**args) # create new instance
42 def filter_comments(filename, flags="//"):
44 with open(filename, "r") as ifile:
45 lines = ifile.readlines()
47 data = re.sub("%s.*$" % (flags), '', data)
48 data = re.sub("^\s*$", '', data)
52 return ''.join(result)
55 class BaseSettings(object):
57 def _load(self, fullname):
58 data = filter_comments(fullname)
63 jparams = json.loads(data)
66 def _sub(self, ldata, rdata):
67 if isinstance(ldata, list) and isinstance(rdata, list):
78 tmp = self._sub(litem, ritem)
81 if tmp and tmp not in data:
89 elif isinstance(ldata, dict) and isinstance(rdata, dict):
91 rdata_bak = copy.deepcopy(rdata)
92 for rkey, rvalue in rdata_bak.items():
95 for lkey, lvalue in ldata.items():
97 if isinstance(lvalue, dict) or isinstance(lvalue, list):
98 data[lkey] = self._sub(lvalue, rdata[lkey])
100 data[lkey] = rdata[lkey]
109 def _save(self, data, filename):
110 if os.path.exists(filename):
112 with open(filename, 'w') as ofile:
113 content = json.dumps(
123 class DefaultSettings(BaseSettings):
125 def __init__(self, path):
126 self._default = os.path.join(path, 'default')
127 self._user = os.path.join(path, 'user')
129 def load(self, filename):
130 dfile = os.path.join(self._default, filename)
131 if os.path.exists(dfile):
132 ddata = self._load(dfile)
135 err = "default file is missing : %s" % (dfile)
138 ufile = os.path.join(self._user, filename)
139 if os.path.exists(ufile):
140 udata = self._load(ufile)
142 data = self._sub(ddata, udata)
144 LOG.info("no user file :%s" % (ufile))
147 def save(self, data, filename):
148 ufile = os.path.join(self._user, filename)
149 self._save(data, ufile)
152 class SingleSettings(BaseSettings):
154 def __init__(self, path):
157 def load(self, filename):
158 pfile = os.path.join(self._path, filename)
159 if os.path.exists(pfile):
160 ddata = self._load(pfile)
163 err = "settings file is missing : %s" % (pfile)
168 def save(self, data, filename):
169 pfile = os.path.join(self._path, filename)
170 self._save(data, pfile)
172 SETS_DEFAULT = "Default"
173 SETS_SINGLE = "Single"
174 SETTINGS = [SETS_SINGLE, SETS_DEFAULT]
177 class Settings(object):
179 def __init__(self, path, filename, mode=SETS_SINGLE):
180 if mode not in SETTINGS:
181 raise Exception("error Settings mode : %s" % (mode))
182 cls_name = mode + "Settings"
183 thismodule = sys.modules[__name__]
184 cls = getattr(thismodule, cls_name)
185 self._settings = cls(path)
186 self._filename = filename
187 self._fset = self._settings.load(filename)
188 self._mset = copy.deepcopy(self._fset)
189 self._register_func()
192 self._fset = self._settings.load(self._filename)
193 self._mset = copy.deepcopy(self._fset)
199 def _setting_file(self, func_name, mset, fset, key, check=None):
201 if hasattr(check, '__call__'):
203 if isinstance(fset, dict):
204 mset[key] = copy.deepcopy(value)
205 fset[key] = copy.deepcopy(value)
206 elif isinstance(fset, list):
209 mset.extend(copy.deepcopy(value))
210 fset.extend(copy.deepcopy(value))
211 self._settings.save(self._fset, self._filename)
212 infunc.__name__ = func_name
213 LOG.debug(self._mset)
214 LOG.debug(self._fset)
218 def _setting_memory(self, func_name, mset, key, check=None):
220 if hasattr(check, '__call__'):
222 if isinstance(mset, dict):
223 mset[key] = copy.deepcopy(value)
224 elif isinstance(mset, list):
225 for i in range(len(mset)):
227 mset.extend(copy.deepcopy(value))
229 infunc.__name__ = func_name
230 LOG.debug(self._mset)
231 LOG.debug(self._fset)
235 def _adding_file(self, func_name, mset, fset, key, check=None):
237 if hasattr(check, '__call__'):
240 mset[key].append(copy.deepcopy(value))
241 fset[key].append(copy.deepcopy(value))
243 mset.append(copy.deepcopy(value))
244 fset.append(copy.deepcopy(value))
246 self._settings.save(self._fset, self._filename)
247 infunc.__name__ = func_name
248 LOG.debug(self._mset)
249 LOG.debug(self._fset)
253 def _adding_memory(self, func_name, mset, key, check=None):
255 if hasattr(check, '__call__'):
258 mset[key].append(copy.deepcopy(value))
260 mset.append(copy.deepcopy(value))
261 infunc.__name__ = func_name
262 LOG.debug(self._mset)
263 LOG.debug(self._fset)
267 def _register_func(self):
268 if isinstance(self._fset, dict):
274 func_name = "set_%s" % item
283 func_name = "mset_%s" % item
287 self._setting_memory(
291 elif isinstance(self._fset, list):
305 self._setting_memory(
329 from vstf.common.log import setup_logging
332 log_file="/var/log/vstf-settings.log",
336 setting = DefaultSettings(path)
337 filename = 'reporters.mail.mail-settings'
338 data = setting.load(filename)
340 setting.save(data, filename)
345 if __name__ == '__main__':