From c7ea03b411152d078bacc027efb36d707d894440 Mon Sep 17 00:00:00 2001 From: Emmanuel Garette Date: Wed, 17 Feb 2021 07:48:19 +0100 Subject: [PATCH] check symlink type for _type in service --- src/rougail/annotator/service.py | 59 ++++++++----------- src/rougail/data/rougail.dtd | 10 ++-- src/rougail/objspace.py | 3 + .../00-base.xml | 0 .../__init__.py | 0 .../makedict/base.json | 0 .../tiramisu/base.py | 0 .../dictionaries/70port_variable/00-base.xml | 19 ++++++ .../dictionaries/70port_variable/__init__.py | 0 .../70port_variable/makedict/base.json | 1 + .../70port_variable/tiramisu/base.py | 27 +++++++++ 11 files changed, 80 insertions(+), 39 deletions(-) rename tests/dictionaries/{70container_serviceaccess => 70port}/00-base.xml (100%) rename tests/dictionaries/{70container_serviceaccess => 70port}/__init__.py (100%) rename tests/dictionaries/{70container_serviceaccess => 70port}/makedict/base.json (100%) rename tests/dictionaries/{70container_serviceaccess => 70port}/tiramisu/base.py (100%) create mode 100644 tests/dictionaries/70port_variable/00-base.xml create mode 100644 tests/dictionaries/70port_variable/__init__.py create mode 100644 tests/dictionaries/70port_variable/makedict/base.json create mode 100644 tests/dictionaries/70port_variable/tiramisu/base.py diff --git a/src/rougail/annotator/service.py b/src/rougail/annotator/service.py index 4cf20e99..6d8ab88b 100644 --- a/src/rougail/annotator/service.py +++ b/src/rougail/annotator/service.py @@ -38,16 +38,6 @@ ERASED_ATTRIBUTES = ('redefine', 'exists', 'optional', 'remove_check', 'namespac 'reflector_object',) -KEY_TYPE = {'variable': 'symlink', - 'PortOption': 'port', - 'UnicodeOption': 'string', - 'NetworkOption': 'network', - 'NetmaskOption': 'netmask', - 'URLOption': 'web_address', - 'FilenameOption': 'filename', - } - - class ServiceAnnotator: """Manage service's object for example:: @@ -122,9 +112,11 @@ class ServiceAnnotator: ) family.variable = [] activate_obj = self._generate_element('boolean', + None, + None, 'activate', True, - elt.xmlfiles, + elt, '.'.join([subpath, 'activate']), ) for key in dir(elt): @@ -137,13 +129,19 @@ class ServiceAnnotator: value, []).append(activate_obj) continue - family.variable.append(self._generate_element(self._get_type(key, - elttype, - elt, - ), + if key == 'name': + dtd_key_type = elttype + '_type' + else: + dtd_key_type = key + '_type' + elt_type = getattr(elt, dtd_key_type, 'string') + if elt_type == 'variable': + elt_type = 'symlink' + family.variable.append(self._generate_element(elt_type, + dtd_key_type, + elttype, key, value, - elt.xmlfiles, + elt, f'{subpath}.{key}' )) family.variable.append(activate_obj) @@ -190,18 +188,26 @@ class ServiceAnnotator: def _generate_element(self, type_, + dtd_key_type, + elttype, key, value, - xmlfiles, + elt, path, ): # pylint: disable=R0913 - variable = self.objectspace.variable(xmlfiles) + variable = self.objectspace.variable(elt.xmlfiles) variable.name = normalize_family(key) variable.mode = None variable.type = type_ if type_ == 'symlink': variable.opt = self.objectspace.paths.get_variable(value) variable.multi = None + if self.objectspace.types[dtd_key_type] != 'variable' and \ + variable.opt.type != self.objectspace.types[dtd_key_type]: + msg = _(f'"{key}" in "{elttype}" must be a variable with type ' + f'"{self.objectspace.types[dtd_key_type]}" not "{variable.opt.type}"') + raise DictConsistencyError(msg, 58, elt.xmlfiles) + else: variable.doc = key variable.default = value @@ -214,21 +220,6 @@ class ServiceAnnotator: ) return variable - def _get_type(self, - key: str, - elt_name: str, - elt, - ) -> str: - if key == 'name': - dtd_key_type = elt_name + '_type' - else: - dtd_key_type = key + '_type' - if key in self.objectspace.booleans_attributs: - return 'boolean' - if hasattr(elt, dtd_key_type): - return KEY_TYPE[getattr(elt, dtd_key_type)] - return 'string' - def _update_override(self, file_, service_name, @@ -247,7 +238,7 @@ class ServiceAnnotator: file_, service_name, ): - if not hasattr(file_, 'file_type') or file_.file_type == "UnicodeOption": + if not hasattr(file_, 'file_type') or file_.file_type == "string": if not hasattr(file_, 'source'): file_.source = basename(file_.name) elif not hasattr(file_, 'source'): diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd index 08aceeb9..b2c0e59d 100644 --- a/src/rougail/data/rougail.dtd +++ b/src/rougail/data/rougail.dtd @@ -49,21 +49,21 @@ - + - - + + - + - + diff --git a/src/rougail/objspace.py b/src/rougail/objspace.py index 7c97b0a0..48d56a8b 100644 --- a/src/rougail/objspace.py +++ b/src/rougail/objspace.py @@ -110,6 +110,7 @@ class RougailObjSpace: self.valid_enums = {} self.booleans_attributs = [] self.has_dyn_option = False + self.types = {} self.make_object_space_classes(xmlreflector) self.rougailconfig = rougailconfig @@ -141,6 +142,8 @@ class RougailObjSpace: if dtd_attr.name in self.booleans_attributs: default_value = convert_boolean(default_value) attrs[dtd_attr.name] = default_value + if dtd_attr.name.endswith('_type'): + self.types[dtd_attr.name] = default_value if dtd_attr.name == 'redefine': # has a redefine attribute, so it's a Redefinable object clstype = Redefinable diff --git a/tests/dictionaries/70container_serviceaccess/00-base.xml b/tests/dictionaries/70port/00-base.xml similarity index 100% rename from tests/dictionaries/70container_serviceaccess/00-base.xml rename to tests/dictionaries/70port/00-base.xml diff --git a/tests/dictionaries/70container_serviceaccess/__init__.py b/tests/dictionaries/70port/__init__.py similarity index 100% rename from tests/dictionaries/70container_serviceaccess/__init__.py rename to tests/dictionaries/70port/__init__.py diff --git a/tests/dictionaries/70container_serviceaccess/makedict/base.json b/tests/dictionaries/70port/makedict/base.json similarity index 100% rename from tests/dictionaries/70container_serviceaccess/makedict/base.json rename to tests/dictionaries/70port/makedict/base.json diff --git a/tests/dictionaries/70container_serviceaccess/tiramisu/base.py b/tests/dictionaries/70port/tiramisu/base.py similarity index 100% rename from tests/dictionaries/70container_serviceaccess/tiramisu/base.py rename to tests/dictionaries/70port/tiramisu/base.py diff --git a/tests/dictionaries/70port_variable/00-base.xml b/tests/dictionaries/70port_variable/00-base.xml new file mode 100644 index 00000000..f6388f1a --- /dev/null +++ b/tests/dictionaries/70port_variable/00-base.xml @@ -0,0 +1,19 @@ + + + + + + + my_variable + my_variable + + + + + + 123 + + + + diff --git a/tests/dictionaries/70port_variable/__init__.py b/tests/dictionaries/70port_variable/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/dictionaries/70port_variable/makedict/base.json b/tests/dictionaries/70port_variable/makedict/base.json new file mode 100644 index 00000000..8445ec19 --- /dev/null +++ b/tests/dictionaries/70port_variable/makedict/base.json @@ -0,0 +1 @@ +{"rougail.my_variable": "123", "services.ntp.ports.my_variable.name": "123", "services.ntp.ports.my_variable.protocol": "udp", "services.ntp.ports.my_variable.activate": true, "services.ntp.ports.my_variable_1.name": "123", "services.ntp.ports.my_variable_1.protocol": "tcp", "services.ntp.ports.my_variable_1.activate": true} diff --git a/tests/dictionaries/70port_variable/tiramisu/base.py b/tests/dictionaries/70port_variable/tiramisu/base.py new file mode 100644 index 00000000..c0ac2625 --- /dev/null +++ b/tests/dictionaries/70port_variable/tiramisu/base.py @@ -0,0 +1,27 @@ +from importlib.machinery import SourceFileLoader +from importlib.util import spec_from_loader, module_from_spec +loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py') +spec = spec_from_loader(loader.name, loader) +func = module_from_spec(spec) +loader.exec_module(func) +for key, value in dict(locals()).items(): + if key != ['SourceFileLoader', 'func']: + setattr(func, key, value) +try: + from tiramisu3 import * +except: + from tiramisu import * +option_2 = PortOption(name="my_variable", doc="my_variable", default="123", allow_private=True, properties=frozenset({"mandatory", "normal"})) +option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2]) +option_7 = SymLinkOption(name="name", opt=option_2) +option_8 = StrOption(name="protocol", doc="protocol", default="udp") +option_9 = BoolOption(name="activate", doc="activate", default=True) +option_6 = OptionDescription(name="my_variable", doc="my_variable", children=[option_7, option_8, option_9]) +option_11 = SymLinkOption(name="name", opt=option_2) +option_12 = StrOption(name="protocol", doc="protocol", default="tcp") +option_13 = BoolOption(name="activate", doc="activate", default=True) +option_10 = OptionDescription(name="my_variable_1", doc="my_variable_1", children=[option_11, option_12, option_13]) +option_5 = OptionDescription(name="ports", doc="ports", children=[option_6, option_10]) +option_4 = OptionDescription(name="ntp", doc="ntp", children=[option_5]) +option_3 = OptionDescription(name="services", doc="services", children=[option_4], properties=frozenset({"hidden"})) +option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_3])