From 91d52743acbc12a5aa541e1cc05e17e74b751ec3 Mon Sep 17 00:00:00 2001 From: Jose Tomas Robles Hahn Date: Wed, 25 Sep 2024 19:14:47 -0300 Subject: [PATCH] fix: Fix errors reported by Mypy after enabling type checking for `lxml` --- src/cl_sii/dte/parse.py | 12 ++++++++++-- src/cl_sii/rtc/parse_aec.py | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/cl_sii/dte/parse.py b/src/cl_sii/dte/parse.py index 2639ffa7..3dabab2e 100644 --- a/src/cl_sii/dte/parse.py +++ b/src/cl_sii/dte/parse.py @@ -163,6 +163,7 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: 'ds:Signature', # "Firma Digital sobre Documento" namespaces=xml_utils.XML_DSIG_NS_MAP, ) + assert signature_em is not None if liquidacion_em is not None or exportaciones_em is not None: raise NotImplementedError("XML element 'Documento' is the only one supported.") @@ -191,6 +192,7 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: 'sii-dte:Encabezado', # "Identificacion y Totales del Documento" namespaces=DTE_XMLNS_MAP, ) + assert encabezado_em is not None # note: excluded because currently it is not useful. # ted_em = documento_em.find( # 'sii-dte:TED', # "Timbre Electronico de DTE" @@ -215,18 +217,22 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: 'sii-dte:IdDoc', # "Identificacion del DTE" namespaces=DTE_XMLNS_MAP, ) + assert id_doc_em is not None emisor_em = encabezado_em.find( 'sii-dte:Emisor', # "Datos del Emisor" namespaces=DTE_XMLNS_MAP, ) + assert emisor_em is not None receptor_em = encabezado_em.find( 'sii-dte:Receptor', # "Datos del Receptor" namespaces=DTE_XMLNS_MAP, ) + assert receptor_em is not None totales_em = encabezado_em.find( 'sii-dte:Totales', # "Montos Totales del DTE" namespaces=DTE_XMLNS_MAP, ) + assert totales_em is not None # 'Documento.Encabezado.IdDoc' # Excluded elements (optional according to the XML schema but the SII may require some of these @@ -453,6 +459,7 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: 'ds:KeyInfo', # "Informacion de Claves Publicas y Certificado" namespaces=xml_utils.XML_DSIG_NS_MAP, ) + assert signature_key_info_em is not None # signature_key_info_key_value_em = signature_key_info_em.find( # 'ds:KeyValue', # namespaces=xml_utils.XML_DSIG_NS_MAP) @@ -460,6 +467,7 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: 'ds:X509Data', # "Informacion del Certificado Publico" namespaces=xml_utils.XML_DSIG_NS_MAP, ) + assert signature_key_info_x509_data_em is not None signature_key_info_x509_cert_em = signature_key_info_x509_data_em.find( 'ds:X509Certificate', # "Certificado Publico" namespaces=xml_utils.XML_DSIG_NS_MAP, @@ -523,7 +531,7 @@ def parse_dte_xml(xml_doc: XmlElement) -> data_models.DteXmlData: ) -def _text_strip_or_none(xml_em: XmlElement) -> Optional[str]: +def _text_strip_or_none(xml_em: XmlElement | None) -> Optional[str]: # note: we need the pair of functions '_text_strip_or_none' and '_text_strip_or_raise' # because, under certain circumstances, an XML tag: # - with no content -> `xml_em.text` is None instead of '' @@ -539,7 +547,7 @@ def _text_strip_or_none(xml_em: XmlElement) -> Optional[str]: return stripped_text -def _text_strip_or_raise(xml_em: XmlElement) -> str: +def _text_strip_or_raise(xml_em: XmlElement | None) -> str: # note: we need the pair of functions '_text_strip_or_none' and '_text_strip_or_raise' # because, under certain circumstances, an XML tag: # - with no content -> `xml_em.text` is None instead of '' diff --git a/src/cl_sii/rtc/parse_aec.py b/src/cl_sii/rtc/parse_aec.py index 6591b10a..d1098886 100644 --- a/src/cl_sii/rtc/parse_aec.py +++ b/src/cl_sii/rtc/parse_aec.py @@ -134,11 +134,13 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ # XPath: //Signature/KeyInfo key_info_em = xml_em.find('ds:KeyInfo', namespaces=xml_utils.XML_DSIG_NS_MAP) + assert key_info_em is not None # XPath: //Signature/KeyInfo/X509Data key_info_x509_data_em = key_info_em.find( 'ds:X509Data', namespaces=xml_utils.XML_DSIG_NS_MAP ) + assert key_info_x509_data_em is not None # XPath: //Signature return dict( @@ -474,14 +476,17 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/IdDTE id_dte_em = xml_em.find('sii-dte:IdDTE', namespaces=DTE_XMLNS_MAP) + assert id_dte_em is not None id_dte_dict = _IdDte.parse_xml_to_dict(id_dte_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cedente cedente_em = xml_em.find('sii-dte:Cedente', namespaces=DTE_XMLNS_MAP) + assert cedente_em is not None cedente_dict = _Cedente.parse_xml_to_dict(cedente_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion/Cesionario cesionario_em = xml_em.find('sii-dte:Cesionario', namespaces=DTE_XMLNS_MAP) + assert cesionario_em is not None cesionario_dict = _Cesionario.parse_xml_to_dict(cesionario_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion @@ -543,6 +548,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ # XPath: /AEC/DocumentoAEC/Cesiones/Cesion/DocumentoCesion doc_cesion_em = xml_em.find('sii-dte:DocumentoCesion', namespaces=DTE_XMLNS_MAP) + assert doc_cesion_em is not None doc_cesion_dict = _DocumentoCesion.parse_xml_to_dict(doc_cesion_em) # Signature over 'DocumentoCesion' @@ -689,6 +695,7 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: 'sii-dte:DocumentoDTECedido', namespaces=DTE_XMLNS_MAP, ) + assert doc_dte_cedido_em is not None # Signature over 'DocumentoDTECedido' # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido/Signature @@ -819,13 +826,16 @@ def parse_xml_to_dict(xml_em: XmlElement) -> Mapping[str, object]: """ # XPath: /AEC/DocumentoAEC/Caratula caratula_em = xml_em.find('sii-dte:Caratula', namespaces=DTE_XMLNS_MAP) + assert caratula_em is not None caratula_dict = _Caratula.parse_xml_to_dict(caratula_em) # XPath: /AEC/DocumentoAEC/Cesiones cesiones_em = xml_em.find('sii-dte:Cesiones', namespaces=DTE_XMLNS_MAP) + assert cesiones_em is not None # XPath: /AEC/DocumentoAEC/Cesiones/DTECedido dte_cedido_em = cesiones_em.find('sii-dte:DTECedido', namespaces=DTE_XMLNS_MAP) + assert dte_cedido_em is not None dte_cedido_dict = _DteCedido.parse_xml_to_dict(dte_cedido_em) # XPath: /AEC/DocumentoAEC/Cesiones/Cesion @@ -919,6 +929,7 @@ def parse_xml_to_dict(xml_doc: XmlElement) -> Mapping[str, object]: # XPath: /AEC/DocumentoAEC doc_aec_em = aec_em.find('sii-dte:DocumentoAEC', namespaces=DTE_XMLNS_MAP) + assert doc_aec_em is not None doc_aec_dict = _DocumentoAec.parse_xml_to_dict(doc_aec_em) # Signature over 'DocumentoAEC' @@ -927,6 +938,7 @@ def parse_xml_to_dict(xml_doc: XmlElement) -> Mapping[str, object]: 'ds:Signature', namespaces=xml_utils.XML_DSIG_NS_MAP, ) + assert signature_over_doc_aec_em is not None signature_over_doc_aec_dict = _XmlSignature.parse_xml_to_dict(signature_over_doc_aec_em) # XPath: /AEC