U
    rÎ·hÁ  ã                   @   s’   d dl m Z  d dlmZ eeƒZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ d dlmZ d d	lmZmZ eefZG d
d„ ded�ZdS )é    )Úcopy)Úkwlisté   )Ú
Descriptor)ÚMetaSerialisable)ÚSequenceÚNestedSequenceÚMultiSequencePart)Ú
namespaced)Úsafe_string)ÚElementÚ	localnamec                   @   s‚   e Zd ZdZdZdZdZdZdZe	dd„ ƒZ
dZedd„ ƒZddd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚSerialisablea  
    Objects can serialise to XML their attributes and child objects.
    The following class attributes are created by the metaclass at runtime:
    __attrs__ = attributes
    __nested__ = single-valued child treated as an attribute
    __elements__ = child elements
    Nr   c                 C   s   t ‚d S ©N)ÚNotImplementedError)Úself© r   úE/tmp/pip-unpacked-wheel-49e_hfpc/openpyxl/descriptors/serialisable.pyÚtagname(   s    zSerialisable.tagnamec           
      C   s¬  t |jƒ}| jD ]"\}}||kr|| ||< ||= qt|ƒD ]\}| d¡rR||= q<|tkrr|| |d| < ||= q<d|kr<| dd¡}|| ||< ||= q<|jr´d| jkr´|j|d< |D ]è}t	|ƒ}|tkrÔd| }t
| |dƒ}|dks¸t|tƒrôq¸t|dƒ�r| |¡}	n"t|jdƒ�r(|j |¡}	n|j}	t|tƒ�rD|	||< q¸t|tƒ�rl| |g ¡ ||  |	¡ q¸t|tƒ�r˜| |jg ¡ ||j  |	¡ q¸|	||< q¸| f |ŽS )z(
        Create object from XML
        Ú{Ú_ú-Ú	attr_textNÚ	from_tree)ÚdictÚattribÚ__namespaced__ÚlistÚ
startswithÚKEYWORDSÚreplaceÚtextÚ	__attrs__r   ÚgetattrÚ
isinstanceÚpropertyÚhasattrr   Zexpected_typer   r   Ú
setdefaultÚappendr	   Ústore)
ÚclsÚnoder   ÚkeyÚnsÚnÚelÚtagÚdescÚobjr   r   r   r   .   sN    




zSerialisable.from_treec                    sš  |d kr| j }| d¡r$|dd … }t| |ˆƒ}t| dˆƒ‰t| ƒ}| jD ]"\}}||krJ|| ||< ||= qJt||ƒ}d| jkr’tt| dƒƒ|_	| j
D ]ü‰ t| jˆ d ƒ}t| ˆ ƒ}	t|dƒrÐt|	dƒrÐ|j|	_t|	tƒ�rNt|tƒrþ|	sìq˜| ˆ |	ˆ¡g}
n8t|tƒ�r"| j|_| ˆ |	ˆ¡}
n‡ ‡fdd„|	D ƒ}
|
D ]}| |¡ �q:q˜ˆ | jk�rj| ˆ |	ˆ¡}n|	d k�rxq˜n
|	 ˆ ¡}|d k	r˜| |¡ q˜|S )Nr   r   Ú	namespacer   c                 3   s   | ]}|  ˆ ˆ¡V  qd S r   )Úto_tree)Ú.0Úv©Z	child_tagr3   r   r   Ú	<genexpr>‘   s     z'Serialisable.to_tree.<locals>.<genexpr>)r   r   r
   r#   r   r   r   r"   r   r!   Ú__elements__Ú	__class__r&   r3   r$   Ú	seq_typesr   r4   r   Úidx_baser(   Ú
__nested__)r   r   Úidxr3   Úattrsr,   r-   r/   r1   r2   Znodesr+   r   r7   r   r4   j   sL    







zSerialisable.to_treec                 c   s„   | j D ]x}t| |ƒ}| d¡r,|dd … }n4|dkr`d|kr`t| j|ƒ}t|ddƒr`| dd¡}|dkr|d k	r|t|ƒfV  qd S )Nr   r   r   Z
hyphenatedFr   )r"   r#   r   r:   r    r   )r   ÚattrÚvaluer1   r   r   r   Ú__iter__    s    


zSerialisable.__iter__c                 C   sN   | j |j ksdS t| ƒt|ƒks$dS | jD ]}t| |ƒt||ƒkr* dS q*dS )NFT)r:   r   r9   r#   )r   Úotherr/   r   r   r   Ú__eq__­   s    
zSerialisable.__eq__c                 C   s
   | |k S r   r   )r   rC   r   r   r   Ú__ne__¸   s    zSerialisable.__ne__c                 C   sn   d  | j| jj¡}g }| j| j D ]2}t| |ƒ}t|tƒr>d }| 	d  |t
|ƒ¡¡ q"d |¡}d ||g¡S )Nz<{0}.{1} object>
Parameters:z{0}={1}z, Ú
)ÚformatÚ
__module__r:   Ú__name__r"   r9   r#   r$   r   r(   ÚreprÚjoin)r   ÚsÚargsÚkr6   r   r   r   Ú__repr__¼   s    þ


zSerialisable.__repr__c                 C   sH   g }| j | j D ]*}t| |ƒ}t|tƒr0t|ƒ}| |¡ qtt|ƒƒS r   )r"   r9   r#   r$   r   Útupler(   Úhash)r   Úfieldsr@   Úvalr   r   r   Ú__hash__Ì   s    

zSerialisable.__hash__c                 C   sŽ   t | ƒt |ƒkrtdƒ‚i }| jD ]}t| |ƒp8t||ƒ||< q"| jD ]:}t| |ƒ}t||ƒ}|rt|rt|| ||< qF|pz|||< qF| jf |ŽS )Nz+Cannot combine instances of different types)ÚtypeÚ	TypeErrorr"   r#   r9   r:   )r   rC   Úvalsr@   r/   ÚaÚbr   r   r   Ú__add__×   s    



zSerialisable.__add__c                 C   sR   | j dd�}| j |¡}| jD ].}|| j| j krtt| |ƒƒ}t|||ƒ q|S )NÚdummy)r   )	r4   r:   r   Ú__dict__r"   r9   r   r#   Úsetattr)r   ÚxmlÚcprN   r6   r   r   r   Ú__copy__ç   s    
zSerialisable.__copy__)NNN)rI   rH   Ú__qualname__Ú__doc__r"   r=   r9   r   r<   r%   r   r3   Úclassmethodr   r4   rB   rD   rE   rO   rT   rZ   r`   r   r   r   r   r      s&   

;
6r   )Ú	metaclassN)r   Úkeywordr   Ú	frozensetr   Ú r   r   Úsequencer   r   r	   r3   r
   Zopenpyxl.compatr   Zopenpyxl.xml.functionsr   r   r   rP   r;   r   r   r   r   r   Ú<module>   s   