f6c4e5572418fb24a020d9b53ccd81dfd216bdf2
2 from logging
import info
3 from os
import makedirs
4 from os
.path
import dirname
5 from collections
.abc
import Mapping
6 from configparser
import ConfigParser
7 from ya2
.p3d
.p3d
import LibP3d
12 def __init__(self
, fpath
, default_dct
=None, persistent
=True):
13 default_dct
= default_dct
or {}
14 if sys
.platform
== 'darwin' and LibP3d
.runtime():
15 fpath
= dirname(__file__
) + '/' + fpath
17 self
.persistent
= persistent
19 # with open(fpath) as json: fdct = load(json)
20 config
= ConfigParser()
22 fdct
= {section
: dict(config
.items(section
))
23 for section
in config
.sections()}
24 fdct
= self
.__typed
_dct
(fdct
)
25 self
.dct
= self
.__add
_default
(default_dct
, fdct
)
27 self
.dct
= default_dct
31 def convert_single_val(val
):
38 if not val
or val
[0] != '[':
45 return convert_single_val(val
)
47 return [elm
.strip() for elm
in val
[1:-1].split(',')]
49 for section
, sec_dct
in dct
.items():
50 for key
, val
in sec_dct
.items():
51 if section
not in new_dct
:
53 new_dct
[section
][key
] = converted(val
)
57 def __add_default(dct
, upd
):
58 for key
, val
in upd
.items():
59 if isinstance(val
, Mapping
):
60 dct
[key
] = DctFile
.__add
_default
(dct
.get(key
, {}), val
)
66 def deepupdate(dct
, new_dct
):
67 for key
, val
in new_dct
.items():
68 if isinstance(val
, Mapping
):
69 dct
[key
] = DctFile
.deepupdate(dct
.get(key
, {}), val
)
75 info('storing %s' % self
.fpath
)
76 if not self
.persistent
: return
77 # json_str = dumps(self.dct, sort_keys=True, indent=4,
78 # separators=(',', ': '))
79 # with open(self.fpath, 'w') as json: json.write(json_str)
81 for section
, sec_dct
in self
.dct
.items():
82 if section
not in fdct
:
84 for key
, val
in sec_dct
.items():
86 fdct
[section
][key
] = '[%s]' % ', '.join(val
)
88 fdct
[section
][key
] = val
89 config
= ConfigParser()
91 config
[key
] = fdct
[key
]
92 if dirname(self
.fpath
):
93 makedirs(dirname(self
.fpath
), exist_ok
=True)
94 with
open(self
.fpath
, 'w') as ini_file
:
95 config
.write(ini_file
)
97 def __getitem__(self
, arg
): return self
.dct
[arg
]
99 def __setitem__(self
, arg
, val
): self
.dct
[arg
] = val
101 def __delitem__(self
, arg
): del self
.dct
[arg
]