U
    Thcœ)  ã                   @   sT   d dl mZ d dlmZ d dlZd dlZd dlm	Z	 G dd„ dƒZ
G dd„ dƒZdS )	é    )Ú
JsonByPath)ÚElementTreeN)Ú
fromstringc                   @   st   e Zd Zddœdd„Zdd„ Zdd„ Zd	d
„ Zedœdd„Zi fdd„Z	dd„ Z
dd„ Zddd„Zdi fdd„ZdS )Úgn_jsonN©Úreturnc                 C   s   d S ©N© )Úselfr	   r	   ú:/home/www/html/webservice/gn_integracao/generic/gn_json.pyÚ__init__	   s    zgn_json.__init__c                 C   s4   |  di ¡}|  di ¡}|  ||¡}tƒ }| |¡S )NÚrootÚtemplate)ÚgetÚhandle_valuesÚDataTransformÚtojson)r
   ÚdataZ	structurer   r   ÚpathsZtransformerr	   r	   r   Úparser   s
    zgn_json.parserc           	      C   s”   g }|D ]†}|  d¡ dd¡}|  ||¡}d|ko>|  d¡dk}d|koT|  d¡dk}|sf|sf|sfqn|r~|s~td|› dƒ‚| ||d	œ¡ q|S )
NÚtoú/Ú.ÚrequiredTÚaccept_falsyúCampo ú obrigatorio)ÚpathÚvalue)r   ÚreplaceÚhandle_itemÚ	ExceptionÚappend)	r
   r   r   Zdata_to_transformÚitemÚ_pathr   Ú
isRequiredr   r	   r	   r   r      s    zgn_json.handle_valuesc                 K   sB   dd„ }ddl m} ||d}|  |¡}t t | t|ƒ¡¡¡S )Nc                 S   sV   | dkrdS |   ¡ dkrdS |   ¡ dkr,dS zt | ¡W S  tk
rP   |  Y S X dS )z7Convert XML string value to None, boolean, int or floatNÚtrueTÚfalseF)ÚlowerÚjsonÚloadsÚ
ValueError)r   r	   r	   r   Ú_fromstring,   s    z%gn_json.xml2json.<locals>._fromstringr   )ÚParker)Zxml_fromstring)Zxmljsonr-   Úprocess_xmlr)   r*   Údumpsr   r   )r
   ÚxmlÚkwargsr,   r-   ZparkerZxml_to_stringr	   r	   r   Úxml2json+   s
    

zgn_json.xml2jsonc                 C   s   t j|ddS )NÚunicode)Úencoding)ÚETZtostring)r
   r0   r	   r	   r   r.   F   s    zgn_json.process_xmlc              
   C   s  |  d¡}|  d¡pi }|r&t |¡ni }|D ]}| ||| ¡ q.|D ]Â}|  ||¡}	d|krHd|kot|  d¡dk}
d|koŠ|  d¡dk}|
sœ|sœ|	sœqHn|
r´|	s´td|› dƒ‚|  d	¡}|rØ|  |d	 |d |	¡n|d }|rH|sò|	||< qH|  |||	|  di ¡¡ qH|S )
z° 
            Manipulacao de dados do map
            Faz o de para dos dados de entrada para os dados de saida,
            podendo ser a saida como um XML ou um JSON
        ÚtagÚattrsr   r   Tr   r   r   Zcustom_path_to)r   r5   ÚElementÚsetr    r!   ÚcallÚbuild_xpath)r
   ZmapItensr)   r   r6   r7   ÚelementÚattrr#   r   r%   r   ÚcpathZitem_tor	   r	   r   Úhandle_dataJ   s*    

"
zgn_json.handle_datac                 C   s$  d}|  d¡rP|  d¡}|r2|  |d |d |¡n|d }|  |||  dd¡¡}|  d¡rf|sf|d }|  d¡r€|  |d |¡}|  d¡rœ|  |d ||¡}|  d¡r¸|  |d ||¡}|  d	¡rÎ|  ||¡}|  d
¡rè|  |d
 |¡}|  d¡r t|d tƒr|d n|d }t| ||ƒ |S )z= 
            Manipulacao e tratamento de cada item 
        FÚfromZcustom_path_fromÚtrimÚdefaultÚcustomZcustom_valueZby_typeÚlistÚchildÚ
globalThisr   )r   r:   Ú	jsonxpathÚhandle_listr?   Ú
isinstanceÚstrÚsetattr)r
   r#   r)   r   r>   Ú_fromZvarNamer	   r	   r   r    t   s*    

"




 zgn_json.handle_itemc                    sT   g }ˆ   di ¡‰t|tƒr0ˆ ˆ d |ˆ¡g}n t|tƒrP‡ ‡‡fdd„|D ƒ}|S )Nr   rD   c                    s   g | ]}ˆ  ˆ d  |ˆ¡‘qS )rD   )r?   )Ú.0Zsub_item©r#   r   r
   r	   r   Ú
<listcomp>   s     z'gn_json.handle_list.<locals>.<listcomp>)r   rI   Údictr?   rD   )r
   r#   r   r   r	   rN   r   rH   —   s    

zgn_json.handle_listFc                 C   s*   t |||d}t|jtƒr$|j ¡  |jS )N)r   r)   rA   )ÚjxprI   r   rJ   Ústrip)r
   r   r)   rA   Úresultr	   r	   r   rG   ¢   s    
zgn_json.jsonxpathc                 C   s€  t  d|¡}dd„ }|d |jkr,| d¡ |r|d|d krl|d  dd¡\}}t| d¡d  d	¡ƒ}	n@|d }d}	d
|kr¬| d
¡}|d }tdd„ |dd… D ƒƒ}| d¡ t|ƒ }
d}t|ƒD ]&}|j|krÌ|d7 }||	krÌ|} q,qÌt	|	| ƒD ]}t
 |¡}| |¡ q |}|D ]}| ||| ¡ q$g }|dk	r,|
r,t|tƒrp|D ]}|||ƒ q\q,|||ƒ q,dS )z Monta o XML baseado em Xpath z /(?=(?:[^'"]|'[^']*'|"[^"]*")*$)c                 S   s*   z|   |¡ W n   t|ƒ| _Y nX d S r   )r"   rJ   Útext)Únoder   r	   r	   r   Úappend_value­   s    z)gn_json.build_xpath.<locals>.append_valuer   ú[é   ú=éÿÿÿÿú]ú@c                 S   s   g | ]}|  d d¡ d¡‘qS )ú'Ú rY   )r   Úsplit)rM   r=   r	   r	   r   rO   À   s   ÿz'gn_json.build_xpath.<locals>.<listcomp>N)Úrer_   r6   ÚpopÚintrR   rP   ÚlenrD   Úranger5   r8   r"   r9   rI   )r
   rU   r   r   r7   Ú
componentsrV   Ú	componentÚtrailZtarget_indexÚlastZfound_indexrE   ÚiZnew_noder=   Úvalr	   r	   r   r;   ª   sJ    


þ



zgn_json.build_xpath)F)Ú__name__Ú
__module__Ú__qualname__r   r   r   r2   rJ   r.   r?   r    rH   rG   r;   r	   r	   r	   r   r      s   	*#
r   c                   @   s`   e Zd Zddœdd„Zdd„ Zdd„ Zedœd	d
„Zedœdd„Z	dd„ Z
dd„ Zddd„ZdS )r   Nr   c                 K   s
   i | _ d S r   ©Úcustoms)r
   Úoptsr	   r	   r   r   á   s    zDataTransform.__init__c                    s   ‡ ‡fdd„}|S )Nc                    s   ˆ  ˆ | ¡ | S r   )Ú _DataTransform__add_custom_rules)Úf©Únamer
   r	   r   Ú	decoratoræ   s    z'DataTransform.custom.<locals>.decoratorr	   )r
   rt   ru   r	   rs   r   rC   å   s    zDataTransform.customc                 C   s   || j |< d S r   rn   )r
   Úkeyrr   r	   r	   r   Z__add_custom_rulesë   s    z DataTransform.__add_custom_rulesc                 C   s
   |   |¡S r   )Ú	jsontoxml)r
   r   r	   r	   r   Útoxmlï   s    zDataTransform.toxmlc                 C   s
   |   |¡S r   )Ú_DataTransform__create_json)r
   r   r	   r	   r   r   ó   s    zDataTransform.tojsonc                 C   sr   ddl m} i }|D ]X}| dd¡}| d¡}| d¡}d|krD|n
|  ||¡}|rh|d k	rh||||ƒ d }q|S )Nr   )Úset_r   Tr   r   r\   )Zpydashrz   r   Ú!_DataTransform__handle_json_value)r
   r   rz   r)   r#   Úis_requiredr   Úcurrent_pathr	   r	   r   Z__create_json÷   s    

zDataTransform.__create_jsonc                 C   sÈ   | j  | d¡¡}| d¡}t|ƒr.|||ƒ}|rŒg }|D ]L}g }| |g ¡}t|ƒD ]\}	}
| ||	 d|
i–¡ qV| |  |¡¡ q:|S t|tƒrÄt|ƒrÄt|d t	ƒrÄ|d  d¡rÄ|  |¡S |S )Nr   Útolistr   r   )
ro   r   ÚcallableÚ	enumerater"   ry   rI   rD   rc   rP   )r
   r   r#   rC   r~   r   ÚvalsZnlistr   ri   rj   r	   r	   r   Z__handle_json_value  s     

.
z!DataTransform.__handle_json_valuer   c                 C   s    dd l }|  |¡}|j|ddS )Nr   T)Zpretty)Ú	xmltodictry   Zunparse)r
   r   r   r‚   Ú	json_datar	   r	   r   rw   '  s    
zDataTransform.jsontoxml)r   )rk   rl   rm   r   rC   rq   rJ   rx   rP   r   ry   r{   rw   r	   r	   r	   r   r   à   s   r   )Úgeneric.JsonByPathr   rQ   Z	xml.etreer   r5   r`   r)   Zxml.etree.ElementTreer   r   r   r	   r	   r	   r   Ú<module>   s    Z