5 # see license for license details
14 LOG = logging.getLogger(__name__)
18 # convert object to a dict
19 dic = {'__class__': obj.__class__.__name__, '__module__': obj.__module__}
20 dic.update(obj.__dict__)
25 # convert dict to object
26 if '__class__' in dic:
27 class_name = dic.pop('__class__')
28 module_name = dic.pop('__module__')
29 module = __import__(module_name)
30 class_ = getattr(module, class_name)
31 args = dict((key.encode('ascii'), value) for key, value in dic.items()) # get args
32 inst = class_(**args) # create new instance
38 def filter_comments(filename, flags="//"):
40 with open(filename, "r") as ifile:
41 lines = ifile.readlines()
43 data = re.sub("%s.*$" % (flags), '', data)
44 data = re.sub("^\s*$", '', data)
48 return ''.join(result)
51 class BaseSettings(object):
52 def _load(self, fullname):
53 data = filter_comments(fullname)
58 jparams = json.loads(data)
61 def _sub(self, ldata, rdata):
62 if isinstance(ldata, list) and isinstance(rdata, list):
68 if isinstance(litem, dict) or isinstance(litem, list):
69 tmp = self._sub(litem, ritem)
72 if tmp and tmp not in data:
80 elif isinstance(ldata, dict) and isinstance(rdata, dict):
82 rdata_bak = copy.deepcopy(rdata)
83 for rkey, rvalue in rdata_bak.items():
86 for lkey, lvalue in ldata.items():
88 if isinstance(lvalue, dict) or isinstance(lvalue, list):
89 data[lkey] = self._sub(lvalue, rdata[lkey])
91 data[lkey] = rdata[lkey]
100 def _save(self, data, filename):
101 if os.path.exists(filename):
103 with open(filename, 'w') as ofile:
104 content = json.dumps(data, sort_keys=True, indent=4, separators=(',', ':'))
108 class DefaultSettings(BaseSettings):
109 def __init__(self, path):
110 self._default = os.path.join(path, 'default')
111 self._user = os.path.join(path, 'user')
113 def load(self, filename):
114 dfile = os.path.join(self._default, filename)
115 if os.path.exists(dfile):
116 ddata = self._load(dfile)
119 err = "default file is missing : %s" % (dfile)
122 ufile = os.path.join(self._user, filename)
123 if os.path.exists(ufile):
124 udata = self._load(ufile)
126 data = self._sub(ddata, udata)
128 LOG.info("no user file :%s" % (ufile))
131 def save(self, data, filename):
132 ufile = os.path.join(self._user, filename)
133 self._save(data, ufile)
136 class SingleSettings(BaseSettings):
137 def __init__(self, path):
140 def load(self, filename):
141 pfile = os.path.join(self._path, filename)
142 if os.path.exists(pfile):
143 ddata = self._load(pfile)
146 err = "settings file is missing : %s" % (pfile)
151 def save(self, data, filename):
152 pfile = os.path.join(self._path, filename)
153 self._save(data, pfile)
155 SETS_DEFAULT = "Default"
156 SETS_SINGLE = "Single"
157 SETTINGS = [SETS_SINGLE, SETS_DEFAULT]
160 class Settings(object):
161 def __init__(self, path, filename, mode=SETS_SINGLE):
162 if mode not in SETTINGS:
163 raise Exception("error Settings mode : %s" % (mode))
164 cls_name = mode + "Settings"
165 thismodule = sys.modules[__name__]
166 cls = getattr(thismodule, cls_name)
167 self._settings = cls(path)
168 self._filename = filename
169 self._fset = self._settings.load(filename)
170 self._mset = copy.deepcopy(self._fset)
171 self._register_func()
174 self._fset = self._settings.load(self._filename)
175 self._mset = copy.deepcopy(self._fset)
181 def _setting_file(self, func_name, mset, fset, key, check=None):
183 if hasattr(check, '__call__'):
185 if isinstance(fset, dict):
186 mset[key] = copy.deepcopy(value)
187 fset[key] = copy.deepcopy(value)
188 elif isinstance(fset, list):
191 mset.extend(copy.deepcopy(value))
192 fset.extend(copy.deepcopy(value))
193 self._settings.save(self._fset, self._filename)
194 infunc.__name__ = func_name
195 LOG.debug(self._mset)
196 LOG.debug(self._fset)
200 def _setting_memory(self, func_name, mset, key, check=None):
202 if hasattr(check, '__call__'):
204 if isinstance(mset, dict):
205 mset[key] = copy.deepcopy(value)
206 elif isinstance(mset, list):
207 for i in range(len(mset)):
209 mset.extend(copy.deepcopy(value))
211 infunc.__name__ = func_name
212 LOG.debug(self._mset)
213 LOG.debug(self._fset)
217 def _adding_file(self, func_name, mset, fset, key, check=None):
219 if hasattr(check, '__call__'):
222 mset[key].append(copy.deepcopy(value))
223 fset[key].append(copy.deepcopy(value))
225 mset.append(copy.deepcopy(value))
226 fset.append(copy.deepcopy(value))
228 self._settings.save(self._fset, self._filename)
229 infunc.__name__ = func_name
230 LOG.debug(self._mset)
231 LOG.debug(self._fset)
235 def _adding_memory(self, func_name, mset, key, check=None):
237 if hasattr(check, '__call__'):
240 mset[key].append(copy.deepcopy(value))
242 mset.append(copy.deepcopy(value))
243 infunc.__name__ = func_name
244 LOG.debug(self._mset)
245 LOG.debug(self._fset)
249 def _register_func(self):
250 if isinstance(self._fset, dict):
256 func_name = "set_%s" % item
257 setattr(self, func_name, self._setting_file(func_name, self._mset, self._fset, item))
258 func_name = "mset_%s" % item
259 setattr(self, func_name, self._setting_memory(func_name, self._mset, item))
260 elif isinstance(self._fset, list):
262 setattr(self, func_name, self._setting_file(func_name, self._mset, self._fset, None))
264 setattr(self, func_name, self._setting_memory(func_name, self._mset, None))
266 setattr(self, func_name, self._adding_file(func_name, self._mset, self._fset, None))
268 setattr(self, func_name, self._adding_memory(func_name, self._mset, None))
272 from vstf.common.log import setup_logging
273 setup_logging(level=logging.DEBUG, log_file="/var/log/vstf-settings.log", clevel=logging.INFO)
276 setting = DefaultSettings(path)
277 filename = 'reporters.mail.mail-settings'
278 data = setting.load(filename)
280 setting.save(data, filename)
285 if __name__ == '__main__':