-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
94 lines (83 loc) · 3.07 KB
/
config.py
File metadata and controls
94 lines (83 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import json
from utils.POO import SingletonDecorator as Singleton
# TODO:
# - don't use singleton here (or not)
@Singleton
class Config:
def __init__(self, filename=None):
# Avoid reinitialisation in case of multiple call
if hasattr(self, '_config') and self._config: return
self._filename = filename
self._config = {}
self.load()
def get(self, item, default=None):
# Return None if item is missing, don't raise exception
return self._config.get(item, default)
def set(self, item, value):
self[item] = value
def __getitem__(self, item):
# Raise a KeyError if item is missing
return self._config[item]
def __setitem__(self, item, value):
self._config[item] = value
def __contains__(self, item):
return self._config.has_key(item)
def load(self, filename=None):
if not filename is None: self._filename = filename
try:
with open(self._filename, 'r') as f:
self._config = json.load(f)
return len(self._config.keys())
except IOError:
return 0
def save(self, filename=None):
if not filename is None: self._filename = filename
with open(self._filename, 'w') as f:
json.dump(self._config, f, indent=4)
@Singleton
class MultifileConfig:
def __init__(self, filename=None):
self._filenames = [None]
self._configs = [{}]
if not filename is None: self.load(filename)
def get(self, item, default=None):
for d in self._configs:
if item in d.keys():
return d[item]
return default
def set(self, item, value, filename=None):
if filename is None: filename = self._filenames[0]
self._configs[self._filenames.index(filename)][item] = value
def __getitem__(self, item):
for d in self._configs:
if item in d.keys():
return d[item]
raise AttributeError
def __setitem__(self, item, value):
# The default is to set to the last conf file loaded
self._configs[0][item] = value
def __contains__(self, key):
return True in map(lambda d: d.has_key(key), self._configs)
def load(self, filename=None):
if filename is None: return
try:
with open(filename, 'r') as f:
self._configs.insert(0, json.load(f))
self._filenames.insert(0, filename)
return len(self._configs[0].keys())
except IOError:
return 0
def save(self, saveas=None):
for filename, config in zip(self._filenames, self._configs):
if filename is None: filename = saveas
if filename is None: continue
with open(filename, 'w') as f:
json.dump(config, f, indent=4)
def close(self, filename=None):
if filename is None:
self._filenames.pop(0)
self._configs.pop(0)
else:
index = self._filenames.index(filename)
self._filenames.pop(index)
self._configs.pop(index)