U
    d                     @   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-rwywncvq/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rd| jkr|j|d< |D ]}t	|}|tkrd| }t
| |d}|dkst|trqt|dr||}	n"t|jdr(|j|}	n|j}	t|trD|	||< qt|trl||g  || |	 qt|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rtt| d|_	| j
D ] t| j d }t|  }	t|drt|	dr|j|	_t|	trNt|tr|	sq| |	g}
n8t|tr"| j|_| |	}
n fdd|	D }
|
D ]}|| q:q | jkrj| |	}n|	d krxqn
|	 }|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   