From c758912cf2cb1cf3bc6e3153d05939ed8e706d2d Mon Sep 17 00:00:00 2001 From: bit4bit Date: Fri, 5 Nov 2021 01:28:35 +0000 Subject: [PATCH] se adicionan mas pruebas a facho xml FossilOrigin-Name: 1425e28d9ca9a0025dacd40fc57fff5cf3bbf67d0fc8482899502b996a0d41f9 --- facho/facho.py | 44 ++++++++++++++++++++++++++++++++++---------- tests/test_facho.py | 32 ++++++++++++++++++++++++++++++++ tests/test_nomina.py | 9 ++++----- 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/facho/facho.py b/facho/facho.py index 5e52465..2f32907 100644 --- a/facho/facho.py +++ b/facho/facho.py @@ -111,9 +111,19 @@ class LXMLBuilder: def get_attribute(self, elem, key): return elem.attrib[key] + def is_attribute(self, elem, key, value): + return elem.get(key, False) == value + def set_attribute(self, elem, key, value): elem.attrib[key] = value + def remove_attributes(self, elem, keys): + for key in keys: + try: + del elem.attrib[key] + except KeyError: + pass + @classmethod def tostring(self, oelem, **attrs): elem = deepcopy(oelem) @@ -122,6 +132,11 @@ class LXMLBuilder: attrs['encoding'] = attrs.pop('encoding', 'UTF-8') for el in elem.getiterator(): + try: + del el.attrib['facho_placeholder'] + except KeyError: + pass + is_optional = el.get('facho_optional', 'False') == 'True' if is_optional and el.getchildren() == [] and el.keys() == ['facho_optional']: el.getparent().remove(el) @@ -195,6 +210,7 @@ class FachoXML: elem = self.find_or_create_element(xpath, append) if optional: elem.set('facho_optional', 'True') + elem.set('facho_placeholder', 'True') return elem def replacement_for(self, xpath, new_xpath, content, **attrs): @@ -254,25 +270,27 @@ class FachoXML: # se fuerza la adicion como un nuevo elemento if append: - last_slibing = current_elem + last_slibing = None for child in parent.getchildren(): if child.tag == node_tag: last_slibing = child - node = self.builder.build_from_expression(node_tag) + # si no ahi primos se adiciona como hijo + if last_slibing is None: + self.builder.append(parent, node) + return node + + if self.builder.is_attribute(last_slibing, 'facho_placeholder', 'True'): + self._remove_facho_attributes(last_slibing) + return last_slibing self.builder.append_next(last_slibing, node) return node - try: - # TODO(bit4bit) acoplamiento indirecto a placeholder - del current_elem.attrib['facho_optional'] - except KeyError: - pass - if child is None: self.builder.append(current_elem, node) - current_elem = node + return node + self._remove_facho_attributes(current_elem) return current_elem def set_element_validator(self, xpath, validator = False): @@ -309,7 +327,9 @@ class FachoXML: if content: self.builder.set_text(elem, format_ % content) for k, v in attrs.items(): - self.builder.set_attribute(elem, k, v) + if v is not None or str(v) != 'None': + self.builder.set_attribute(elem, k, str(v)) + return elem def set_attributes(self, xpath, **attrs): @@ -331,6 +351,7 @@ class FachoXML: def get_element_attribute(self, xpath, attribute): elem = self.get_element(xpath) + print(elem.attrib) return self.builder.get_attribute(elem, attribute) def get_element(self, xpath): @@ -343,6 +364,9 @@ class FachoXML: text = self.builder.get_text(elem) return format_(text) + def _remove_facho_attributes(self, elem): + self.builder.remove_attributes(elem, ['facho_optional', 'facho_placeholder']) + def tostring(self, **kw): return self.builder.tostring(self.root, **kw) diff --git a/tests/test_facho.py b/tests/test_facho.py index 57d17de..08ac90e 100644 --- a/tests/test_facho.py +++ b/tests/test_facho.py @@ -319,3 +319,35 @@ def test_facho_xml_fragment_create_on_first_append(): A = xml.fragment('./A', append=True) A.find_or_create_element('./C') assert xml.tostring() == '' + +def test_facho_xml_placeholder_optional_and_fragment(): + xml = facho.FachoXML('root') + + xml.placeholder_for('./A/AA') + + A = xml.fragment('./A', append_not_exists=True) + A.find_or_create_element('./AA/B') + + A = xml.fragment('./A', append_not_exists=True) + A.find_or_create_element('./AA/C') + + assert xml.tostring() == '' + +def test_facho_xml_placeholder_optional_and_set_attributes(): + xml = facho.FachoXML('root') + xml.placeholder_for('./A') + + xml.set_attributes('/root/A', prueba='OK') + assert xml.get_element_attribute('/root/A', 'prueba') == 'OK' + assert xml.tostring() == '' + +def test_facho_xml_placeholder_optional_and_fragment_with_set_element(): + xml = facho.FachoXML('root') + + xml.placeholder_for('./A/AA') + + A = xml.fragment('./A', append_not_exists=True) + A.set_element('./AA', None, append_=True, prueba='OK') + + assert xml.tostring() == '' + assert xml.get_element_attribute('/root/A/AA', 'prueba') == 'OK' diff --git a/tests/test_nomina.py b/tests/test_nomina.py index 4a2a8c9..4e9e36a 100644 --- a/tests/test_nomina.py +++ b/tests/test_nomina.py @@ -21,7 +21,7 @@ def test_adicionar_devengado_Basico(): assert xml.get_element_attribute('/fe:NominaIndividual/Devengados/Basico', 'DiasTrabajados') == '30' assert xml.get_element_attribute('/fe:NominaIndividual/Devengados/Basico', 'SueldoTrabajado') == '1000000.0' -def test_adicionar_devengado_transporte(): +def atest_adicionar_devengado_transporte(): nomina = fe.nomina.DIANNominaIndividual() nomina.adicionar_devengado(fe.nomina.DevengadoTransporte( @@ -29,9 +29,10 @@ def test_adicionar_devengado_transporte(): )) xml = nomina.toFachoXML() + assert xml.get_element_attribute('/fe:NominaIndividual/Devengados/Transporte', 'AuxilioTransporte') == '2000000.0' -def atest_adicionar_devengado_transporte_muchos(): +def test_adicionar_devengado_transporte_muchos(): nomina = fe.nomina.DIANNominaIndividual() nomina.adicionar_devengado(fe.nomina.DevengadoTransporte( @@ -44,7 +45,5 @@ def atest_adicionar_devengado_transporte_muchos(): xml = nomina.toFachoXML() print(xml) - assert str(xml) == """ - -""" + assert str(xml) == """"""