B
    P\                 @   s   d dl mZ 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	ZdS )    )absolute_import)copy)kwlist   )
Descriptor)_Serialiasable)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   @lib/python3.7/site-packages/openpyxl/descriptors/serialisable.pytagname)   s    zSerialisable.tagnamec       
      C   s  t |j}x,| jD ]"\}}||kr|| ||< ||= qW xht|D ]\}|drX||= qB|tkrx|| |d| < ||= qBd|krB|dd}|| ||< ||= qBW |jrd| jkr|j|d< x|D ]}t	|}|tkrd| }t
| |d}|dkst|trqt|dr||}	n"t|jdr2|j|}	n|j}	t|trN|	||< qt|trv||g  || |	 qt|tr||jg  ||j |	 q|	||< qW | 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
   Z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| }x,| jD ]"\}}||krL|| ||< ||= qLW t||}d| jkrtt| d|_	x| j
D ] t| j d }t|  }	t|drt|	dr|j|	_t|	tr^t|tr
|	sq| |	g}
n8t|tr.| j|_| |	}
n fdd|	D }
x`|
D ]}|| qHW q | jkrz| |	}n|	d krqn
|	 }|d k	r|| qW |S )Nr   r   	namespacer   c             3   s   | ]}|  V  qd S )N)to_tree).0v)	child_tagr2   r   r   	<genexpr>   s    z'Serialisable.to_tree.<locals>.<genexpr>)r   r   r   r#   r   r   r   r"   r   r!   __elements__	__class__r&   r2   r$   	seq_typesr	   r3   r   idx_baser(   
__nested__)r   r   idxr2   Zattrsr+   r,   r.   r0   r1   Znodesr*   r   )r6   r2   r   r3   k   sL    







zSerialisable.to_treec             c   s   x| j D ]x}t| |}|dr.|dd  }n4|dkrbd|krbt| j|}t|ddrb|dd}|dkr|d k	r|t|fV  qW d S )Nr   r   r   Z
hyphenatedFr   )r"   r#   r   r9   r    r   )r   attrvaluer0   r   r   r   __iter__   s    

zSerialisable.__iter__c             C   sP   | j |j ksdS t| t|ks$dS x&| jD ]}t| |t||kr,dS q,W dS )NFT)r9   r   r8   r#   )r   otherr.   r   r   r   __eq__   s    zSerialisable.__eq__c             C   s
   | |k S )Nr   )r   rA   r   r   r   __ne__   s    zSerialisable.__ne__c             C   sr   d | j| jj}g }xB| j| j D ]2}t| |}t|tr@d }|	d |t
| q$W d|}d||gS )Nz<{0}.{1} object>
Parameters:z{0}={1}z, 
)format
__module__r9   __name__r"   r8   r#   r$   r   r(   reprjoin)r   sargskr5   r   r   r   __repr__   s    



zSerialisable.__repr__c             C   sL   g }x:| j | j D ]*}t| |}t|tr2t|}|| qW tt|S )N)r"   r8   r#   r$   r   tupler(   hash)r   Zfieldsr>   valr   r   r   __hash__   s    

zSerialisable.__hash__c             C   s   t | t |krtdi }x&| jD ]}t| |p:t||||< q$W xD| jD ]:}t| |}t||}|rz|rz|| ||< qL|p|||< qLW | jf |S )Nz+Cannot combine instances of different types)type	TypeErrorr"   r#   r8   r9   )r   rA   Zvalsr>   r.   abr   r   r   __add__   s    

zSerialisable.__add__c             C   sV   | j dd}| j|}x8| jD ].}|| j| j kr tt| |}t||| q W |S )NZdummy)r   )	r3   r9   r   __dict__r"   r8   r   r#   setattr)r   ZxmlZcprL   r5   r   r   r   __copy__   s    zSerialisable.__copy__)NNN)rG   rF   __qualname____doc__r"   r<   r8   r   r;   r%   r   r2   classmethodr   r3   r@   rB   rC   rM   rQ   rV   rY   r   r   r   r   r      s"   <
6r   N)Z
__future__r   r   keywordr   	frozensetr    r   r   Zsequencer   r	   r
   r2   r   Zopenpyxl.compatr   Zopenpyxl.xml.functionsr   r   r   rN   r:   r   r   r   r   r   <module>   s   