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 json
import load
, dumps
8 from ya2
.gameobject
import GameObject
9 from ya2
.lib
.p3d
.p3d
import LibP3d
12 class DctFile(GameObject
):
14 def __init__(self
, fpath
, default_dct
=None, persistent
=True):
15 GameObject
.__init
__(self
)
16 default_dct
= default_dct
or {}
17 if sys
.platform
== 'darwin' and LibP3d
.runtime():
18 fpath
= dirname(__file__
) + '/' + fpath
20 self
.persistent
= persistent
22 #with open(fpath) as json: fdct = load(json)
23 config
= ConfigParser()
25 fdct
= {section
: dict(config
.items(section
)) for section
in config
.sections()}
26 fdct
= self
.__typed
_dct
(fdct
)
27 self
.dct
= self
.__add
_default
(default_dct
, fdct
)
28 except IOError: self
.dct
= default_dct
32 def convert_single_val(val
):
35 try: return float(val
)
37 if not val
or val
[0] != '[':
42 try: return convert_single_val(val
)
44 return [elm
.strip() for elm
in val
[1:-1].split(',')]
46 for section
, sec_dct
in dct
.items():
47 for key
, val
in sec_dct
.items():
48 if section
not in new_dct
:
50 new_dct
[section
][key
] = converted(val
)
54 def __add_default(dct
, upd
):
55 for key
, val
in upd
.items():
56 if isinstance(val
, Mapping
):
57 dct
[key
] = DctFile
.__add
_default
(dct
.get(key
, {}), val
)
58 else: dct
[key
] = upd
[key
]
62 def deepupdate(dct
, new_dct
):
63 for key
, val
in new_dct
.items():
64 if isinstance(val
, Mapping
):
65 dct
[key
] = DctFile
.deepupdate(dct
.get(key
, {}), val
)
70 info('storing %s' % self
.fpath
)
71 if not self
.persistent
: return
72 #json_str = dumps(self.dct, sort_keys=True, indent=4,
73 # separators=(',', ': '))
74 #with open(self.fpath, 'w') as json: json.write(json_str)
76 for section
, sec_dct
in self
.dct
.items():
77 if section
not in fdct
:
79 for key
, val
in sec_dct
.items():
81 fdct
[section
][key
] = '[%s]' % ', '.join(val
)
83 fdct
[section
][key
] = val
84 config
= ConfigParser()
86 config
[key
] = fdct
[key
]
87 if dirname(self
.fpath
):
88 makedirs(dirname(self
.fpath
), exist_ok
=True)
89 with
open(self
.fpath
, 'w') as ini_file
:
90 config
.write(ini_file
)
92 def __getitem__(self
, arg
): return self
.dct
[arg
]
94 def __setitem__(self
, arg
, val
): self
.dct
[arg
] = val
96 def __delitem__(self
, arg
): del self
.dct
[arg
]