pyulib: ajouter ShConfig
This commit is contained in:
parent
f31f5f72ad
commit
9c5b46b372
|
@ -11,14 +11,18 @@ value peut être placé entre double quotes ou simple quotes. Elle peut s'étend
|
||||||
plusieurs lignes si elle est mise entre quotes, ou si elle se termine par \
|
plusieurs lignes si elle est mise entre quotes, ou si elle se termine par \
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__all__ = ('ConfigFile', 'ShConfigFile', 'PListFile')
|
__all__ = (
|
||||||
|
'ConfigFile', 'ShConfigFile', 'PListFile',
|
||||||
|
'ShConfig',
|
||||||
|
)
|
||||||
|
|
||||||
import os, string, re, types
|
import os, string, re, types, shlex
|
||||||
from os import path
|
from os import path
|
||||||
|
|
||||||
from base import make_prop, isseq, seqof, firstof
|
from base import odict, make_prop, isseq, seqof, firstof
|
||||||
from uio import _s, _u
|
from uio import _s, _u
|
||||||
from files import TextFile
|
from files import TextFile
|
||||||
|
from ulib.formats import unicodeF
|
||||||
|
|
||||||
####################
|
####################
|
||||||
# gestion des commentaires
|
# gestion des commentaires
|
||||||
|
@ -806,6 +810,68 @@ class PListFile(TextFile):
|
||||||
_print_debug("XXX string=%s" % string)
|
_print_debug("XXX string=%s" % string)
|
||||||
return string
|
return string
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
# classes utilisant shlex et l'interface odict
|
||||||
|
|
||||||
|
class ShConfig(odict):
|
||||||
|
_formats = None
|
||||||
|
def __init__(self, config, formats=None):
|
||||||
|
super(ShConfig, self).__init__()
|
||||||
|
if formats is None: formats = {}
|
||||||
|
else: formats = dict(formats)
|
||||||
|
self.__dict__['_formats'] = formats
|
||||||
|
for name in self._formats.keys():
|
||||||
|
self[name] = None
|
||||||
|
|
||||||
|
inf = open(config, 'rb')
|
||||||
|
try: s = inf.read()
|
||||||
|
finally: inf.close()
|
||||||
|
parts = shlex.split(s, True)
|
||||||
|
self.parse(parts)
|
||||||
|
|
||||||
|
def get_format(self, name):
|
||||||
|
format = None
|
||||||
|
if format is None: format = self._formats.get(name, None)
|
||||||
|
if format is None: format = self._formats.get(None, None)
|
||||||
|
if format is None: format = unicodeF
|
||||||
|
return format
|
||||||
|
|
||||||
|
RE_ARRAY = re.compile(r'([^=]+)=\((.*)')
|
||||||
|
RE_ARRAY_LAST = re.compile(r'(.*)\)$')
|
||||||
|
RE_SCALAR = re.compile(r'([^=]+)=(.*)')
|
||||||
|
def parse(self, parts):
|
||||||
|
i = 0
|
||||||
|
while i < len(parts):
|
||||||
|
part = parts[i]
|
||||||
|
i += 1
|
||||||
|
amo = self.RE_ARRAY.match(part)
|
||||||
|
smo = self.RE_SCALAR.match(part)
|
||||||
|
if amo is not None:
|
||||||
|
array = []
|
||||||
|
name, value = amo.groups()
|
||||||
|
format = self.get_format(name)
|
||||||
|
if value != '': array.append(format.parse(value))
|
||||||
|
while i < len(parts):
|
||||||
|
value = parts[i]
|
||||||
|
i += 1
|
||||||
|
mo = self.RE_ARRAY_LAST.match(value)
|
||||||
|
if mo is not None:
|
||||||
|
value = mo.group(1)
|
||||||
|
if value != '': array.append(format.parse(value))
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
array.append(format.parse(value))
|
||||||
|
self[name] = array
|
||||||
|
elif smo is not None:
|
||||||
|
name, value = smo.groups()
|
||||||
|
format = self.get_format(name)
|
||||||
|
self[name] = format.parse(value)
|
||||||
|
else:
|
||||||
|
continue # ignorer l'erreur pour le moment
|
||||||
|
raise ValueError("%s: not a variable" % part)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import doctest
|
import doctest
|
||||||
doctest.testmod()
|
doctest.testmod()
|
||||||
|
|
Loading…
Reference in New Issue