some correction

This commit is contained in:
Emmanuel Garette 2021-02-14 17:48:50 +01:00
parent c24ef61bff
commit b0588768af
9 changed files with 72 additions and 77 deletions

View file

@ -66,8 +66,6 @@ class CheckAnnotator(TargetAnnotator, ParamAnnotator):
variable_type = None variable_type = None
if obj.name == 'valid_enum': if obj.name == 'valid_enum':
for target in obj.target: for target in obj.target:
if variable_type and target.name.type != variable_type:
raise Exception('pfff')
variable_type = target.name.type variable_type = target.name.type
return variable_type return variable_type

View file

@ -78,8 +78,6 @@ class FamilyAnnotator(Walk):
return True return True
else: else:
return True return True
else:
return False
return False return False
def remove_empty_families(self) -> None: def remove_empty_families(self) -> None:
@ -99,8 +97,6 @@ class FamilyAnnotator(Walk):
for family in self.get_families(): for family in self.get_families():
if not hasattr(family, 'description'): if not hasattr(family, 'description'):
family.description = family.name family.description = family.name
if not hasattr(family, 'path'):
family.path = family.name
family.doc = family.description family.doc = family.description
del family.description del family.description
family.name = normalize_family(family.name) family.name = normalize_family(family.name)

View file

@ -69,7 +69,8 @@ class ParamAnnotator:
) )
param.text = self.objectspace.paths.get_variable(path) param.text = self.objectspace.paths.get_variable(path)
if variable_type and param.text.type != variable_type: if variable_type and param.text.type != variable_type:
raise Exception('pfff', variable_type, param.text.type) msg = _(f'"{obj.name}" has type "{variable_type}" but param has type "{param.text.type}"')
raise DictConsistencyError(msg, 26, param.xmlfiles)
if suffix: if suffix:
param.suffix = suffix param.suffix = suffix
family_path = self.objectspace.paths.get_variable_family_path(path) family_path = self.objectspace.paths.get_variable_family_path(path)
@ -83,7 +84,7 @@ class ParamAnnotator:
elif variable_type: elif variable_type:
if 'type' in vars(param) and variable_type != param.type: if 'type' in vars(param) and variable_type != param.type:
msg = _(f'parameter has incompatible type "{param.type}" ' msg = _(f'parameter has incompatible type "{param.type}" '
f'with type "{variable_type}")') f'with type "{variable_type}"')
raise DictConsistencyError(msg, 7, param.xmlfiles) raise DictConsistencyError(msg, 7, param.xmlfiles)
try: try:
param.text = CONVERT_OPTION[variable_type].get('func', str)(param.text) param.text = CONVERT_OPTION[variable_type].get('func', str)(param.text)

View file

@ -59,47 +59,48 @@ class RougailConvert:
"""Rougail object """Rougail object
""" """
def __init__(self) -> None: def __init__(self) -> None:
self.xmlreflector = XMLReflector() xmlreflector = XMLReflector()
self.xmlreflector.parse_dtd() rougailobjspace = RougailObjSpace(xmlreflector)
self.rougailobjspace = RougailObjSpace(self.xmlreflector) self._load_dictionaries(xmlreflector,
self._load_dictionaries(None, RougailConfig['dictionaries_dir']) rougailobjspace,
for extra_name, extra_dir in RougailConfig['extra_dictionaries'].items(): RougailConfig['variable_namespace'],
self._load_dictionaries(extra_name, extra_dir) RougailConfig['dictionaries_dir'],
)
for namespace, extra_dir in RougailConfig['extra_dictionaries'].items():
if namespace in ['services', RougailConfig['variable_namespace']]:
msg = _(f'Namespace name "{namespace}" is not allowed')
raise DictConsistencyError(msg, 21, None)
self._load_dictionaries(xmlreflector,
rougailobjspace,
namespace,
extra_dir,
)
functions_file = RougailConfig['functions_file']
SpaceAnnotator(rougailobjspace,
functions_file,
)
self.output = TiramisuReflector(rougailobjspace,
functions_file,
).get_text() + '\n'
def _load_dictionaries(self, def _load_dictionaries(self,
xmlreflector: XMLReflector,
rougailobjspace: RougailObjSpace,
namespace: str, namespace: str,
xmlfolders: List[str], xmlfolders: List[str],
) -> List[str]: ) -> List[str]:
if namespace in ['services', RougailConfig['variable_namespace']]: for xmlfile, document in xmlreflector.load_xml_from_folders(xmlfolders):
msg = _(f'Namespace name "{namespace}" is not allowed') rougailobjspace.xml_parse_document(xmlfile,
raise DictConsistencyError(msg, 21, None) document,
if hasattr(self.rougailobjspace.space, 'variables') and \ namespace,
namespace in self.rougailobjspace.space.variables: )
msg = _(f'Namespace "{namespace}" is already loader')
raise DictConsistencyError(msg, 2, None)
for xmlfile in self.xmlreflector.load_xml_from_folders(xmlfolders):
document = self.xmlreflector.parse_xmlfile(xmlfile)
self.rougailobjspace.redefine_variables = []
self.rougailobjspace.xml_parse_document(xmlfile,
document,
namespace,
)
def save(self, def save(self,
filename: str, filename: str,
) -> str: ) -> str:
"""Return tiramisu object declaration as a string """Return tiramisu object declaration as a string
""" """
functions_file = RougailConfig['functions_file']
SpaceAnnotator(self.rougailobjspace,
functions_file,
)
tiramisu_objects = TiramisuReflector(self.rougailobjspace,
functions_file,
)
self.rougailobjspace = None
output = tiramisu_objects.get_text() + '\n'
if filename: if filename:
with open(filename, 'w') as tiramisu: with open(filename, 'w') as tiramisu:
tiramisu.write(output) tiramisu.write(self.output)
return output return self.output

View file

@ -169,8 +169,6 @@ class RougailObjSpace:
): ):
"""Parses a Rougail XML file and populates the RougailObjSpace """Parses a Rougail XML file and populates the RougailObjSpace
""" """
if not namespace:
namespace = RougailConfig['variable_namespace']
redefine_variables = [] redefine_variables = []
self._xml_parse(xmlfile, self._xml_parse(xmlfile,
document, document,
@ -328,7 +326,8 @@ class RougailObjSpace:
tag = FORCE_TAG.get(child.tag, child.tag) tag = FORCE_TAG.get(child.tag, child.tag)
if tag not in vars(space): if tag not in vars(space):
setattr(space, tag, {}) setattr(space, tag, {})
return getattr(self, child.tag)(xmlfile, name) obj = getattr(self, child.tag)(xmlfile, name)
return obj
def get_existed_obj(self, def get_existed_obj(self,
name: str, name: str,
@ -342,10 +341,7 @@ class RougailObjSpace:
name = normalize_family(name) name = normalize_family(name)
if child.tag == 'variable': # pylint: disable=E1101 if child.tag == 'variable': # pylint: disable=E1101
if namespace != RougailConfig['variable_namespace']: if namespace != RougailConfig['variable_namespace']:
if isinstance(space, self.variables): name = space.path + '.' + name
name = space.name + '.' + name
else:
name = space.path + '.' + name
if not self.paths.path_is_defined(name): if not self.paths.path_is_defined(name):
return None return None
old_family_name = self.paths.get_variable_family_path(name) old_family_name = self.paths.get_variable_family_path(name)
@ -469,30 +465,24 @@ class RougailObjSpace:
family_name = normalize_family(document.attrib['name']) family_name = normalize_family(document.attrib['name'])
else: else:
family_name = namespace family_name = namespace
if isinstance(space, self.variables):
subpath = space.name
else:
subpath = space.path
self.paths.add_variable(namespace, self.paths.add_variable(namespace,
normalize_family(variableobj.name), normalize_family(variableobj.name),
subpath, space.path,
document.attrib.get('dynamic') is not None, document.attrib.get('dynamic') is not None,
variableobj, variableobj,
) )
elif isinstance(variableobj, self.family): # pylint: disable=E1101 elif isinstance(variableobj, self.family): # pylint: disable=E1101
if isinstance(space, self.variables):
subpath = space.name
else:
subpath = space.path
family_name = normalize_family(variableobj.name) family_name = normalize_family(variableobj.name)
if namespace != RougailConfig['variable_namespace']: if namespace != RougailConfig['variable_namespace']:
family_name = namespace + '.' + family_name family_name = namespace + '.' + family_name
self.paths.add_family(namespace, self.paths.add_family(namespace,
family_name, family_name,
variableobj, variableobj,
subpath, space.path,
) )
elif isinstance(variableobj, self.variables):
variableobj.path = variableobj.name
@staticmethod @staticmethod
def add_to_tree_structure(variableobj, def add_to_tree_structure(variableobj,

View file

@ -41,9 +41,6 @@ class XMLReflector:
writing the xml result on the disk writing the xml result on the disk
""" """
def __init__(self): def __init__(self):
self.dtd = None
def parse_dtd(self) -> None:
"""Loads the Creole DTD """Loads the Creole DTD
:raises IOError: if the DTD is not found :raises IOError: if the DTD is not found
@ -56,23 +53,9 @@ class XMLReflector:
with open(dtdfilename, 'r') as dtdfd: with open(dtdfilename, 'r') as dtdfd:
self.dtd = DTD(dtdfd) self.dtd = DTD(dtdfd)
def parse_xmlfile(self, xmlfile): def load_xml_from_folders(self,
"""Parses and validates some Creole XML against the Creole DTD xmlfolders: List[str],
):
:returns: the root element tree object
"""
try:
document = parse(xmlfile)
except XMLSyntaxError as err:
raise DictConsistencyError(_(f'not a XML file: {err}'), 52, [xmlfile]) from err
if not self.dtd.validate(document):
dtd_error = self.dtd.error_log.filter_from_errors()[0]
msg = _(f'not a valid XML file: {dtd_error}')
raise DictConsistencyError(msg, 43, [xmlfile])
return document.getroot()
@staticmethod
def load_xml_from_folders(xmlfolders: List[str]):
"""Loads all the XML files located in the xmlfolders' list """Loads all the XML files located in the xmlfolders' list
:param xmlfolders: list of full folder's name :param xmlfolders: list of full folder's name
@ -82,4 +65,12 @@ class XMLReflector:
filename.endswith('.xml')] filename.endswith('.xml')]
filenames.sort() filenames.sort()
for xmlfile in filenames: for xmlfile in filenames:
yield xmlfile try:
document = parse(xmlfile)
except XMLSyntaxError as err:
raise DictConsistencyError(_(f'not a XML file: {err}'), 52, [xmlfile]) from err
if not self.dtd.validate(document):
dtd_error = self.dtd.error_log.filter_from_errors()[0]
msg = _(f'not a valid XML file: {dtd_error}')
raise DictConsistencyError(msg, 43, [xmlfile])
yield xmlfile, document.getroot()

View file

@ -0,0 +1,18 @@
<?xml version='1.0' encoding='UTF-8'?>
<rougail>
<variables>
<family name="enumfam" mode="expert">
<variable name="str" multi="True"/>
<variable name="enumvar" type="number"/>
</family>
</variables>
<constraints>
<check name="valid_enum">
<param type="variable">str</param>
<target>enumvar</target>
</check>
</constraints>
</rougail>
<!-- vim: ts=4 sw=4 expandtab
-->