î
æ^Q\û  ã               @   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 Gd 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 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   úV/var/www/dbchiro/venv/lib/python3.4/site-packages/openpyxl/descriptors/serialisable.pyÚtagname)   s    zSerialisable.tagnamec       	      C   s#  t  | j ƒ } x; |  j D]0 \ } } | | k r | | | | <| | =q q WxU t | ƒ D]G } | j d ƒ ry | | =qZ | t k rZ | | | d | <| | =qZ qZ W| j rÍ d |  j k rÍ | j | d <n  xI| D]A} t | ƒ } | t k rÿ d | } n  t	 |  | d ƒ } | d k sÔ t
 | t ƒ r2qÔ n  t | d ƒ rS| j | ƒ } n0 t | j d ƒ rz| j j | ƒ } n	 | j } t
 | t ƒ rŸ| | | <qÔ t
 | t ƒ rÒ| j | g  ƒ | | j | ƒ qÔ t
 | t ƒ r| j | j g  ƒ | | j j | ƒ qÔ | | | <qÔ W|  |   S)z(
        Create object from XML
        ú{Ú_Ú	attr_textNÚ	from_tree)ÚdictÚattribÚ__namespaced__ÚlistÚ
startswithÚKEYWORDSÚtextÚ	__attrs__r   ÚgetattrÚ
isinstanceÚpropertyÚhasattrr   Zexpected_typer	   r   Ú
setdefaultÚappendr
   Ústore)	ÚclsÚnoder   ÚkeyÚnsÚelÚtagÚdescÚobjr   r   r   r   /   sF    
	zSerialisable.from_treec                s6  | d  k r |  j  } n  | j d ƒ r: | d d  … } n  t |  | ˆ ƒ } t |  d ˆ ƒ ‰ t |  ƒ } x; |  j D]0 \ } } | | k rt | | | | <| | =qt qt Wt | | ƒ } d |  j k rá t t |  d ƒ ƒ | _	 n  xN|  j
 D]C‰  t |  j ˆ  d  ƒ } t |  ˆ  ƒ }	 t |	 t ƒ rÊt | t ƒ rZ|	 s?që n  | j ˆ  |	 ˆ ƒ g }
 nO t | t ƒ r|  j | _ | j ˆ  |	 ˆ ƒ }
 n ‡  ‡ f d d †  |	 Dƒ }
 x‚ |
 D] } | j | ƒ q°Wqë ˆ  |  j k rñ| j ˆ  |	 ˆ ƒ } n! |	 d  k rqë n |	 j ˆ  ƒ } | d  k	 rë | j | ƒ që që W| S)Nr   r   Ú	namespacer   c             3   s!   |  ] } | j  ˆ  ˆ ƒ Vq d  S)N)Úto_tree)Ú.0Úv)Ú	child_tagr0   r   r   ú	<genexpr>Œ   s    z'Serialisable.to_tree.<locals>.<genexpr>)r   r   r   r!   r   r   r   r    r   r   Ú__elements__Ú	__class__r"   Ú	seq_typesr	   r1   r   Úidx_baser&   Ú
__nested__)r   r   Úidxr0   Úattrsr*   r+   r,   r.   r/   Únodesr)   r   )r4   r0   r   r1   g   sH    zSerialisable.to_treec             c   su   xn |  j  D]c } t |  | ƒ } | j d ƒ rA | d d  … } n  | d k r
 | d  k	 r
 | t | ƒ f Vq
 q
 Wd  S)Nr   r   r   )r    r!   r   r   )r   ÚattrÚvaluer   r   r   Ú__iter__›   s    zSerialisable.__iter__c             C   sl   |  j  | j  k s d St |  ƒ t | ƒ k s2 d Sx3 |  j D]( } t |  | ƒ t | | ƒ k r< d Sq< Wd S)NFT)r7   r   r6   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   s¤   d j  |  j |  j j ƒ } g  } x^ |  j |  j D]L } t |  | ƒ } t | t ƒ r_ d  } n  | j	 d j  | t
 | ƒ ƒ ƒ q2 Wd j | ƒ } d j | | g ƒ S)Nz<{0}.{1} object>
Parameters:z{0}={1}z, Ú
)ÚformatÚ
__module__r7   Ú__name__r    r6   r!   r"   r   r&   ÚreprÚjoin)r   ÚsÚargsÚkr3   r   r   r   Ú__repr__³   s    	#zSerialisable.__repr__c             C   sk   g  } xR |  j  |  j D]@ } t |  | ƒ } t | t ƒ rJ t | ƒ } n  | j | ƒ q Wt t | ƒ ƒ S)N)r    r6   r!   r"   r   Útupler&   Úhash)r   Úfieldsr>   Úvalr   r   r   Ú__hash__Ã   s    zSerialisable.__hash__c             C   sÏ   t  |  ƒ t  | ƒ k r' t d ƒ ‚ n  i  } x3 |  j D]( } t |  | ƒ pX t | | ƒ | | <q7 Wx\ |  j D]Q } t |  | ƒ } t | | ƒ } | r® | r® | | | | <qm | p· | | | <qm W|  j |   S)Nz+Cannot combine instances of different types)ÚtypeÚ	TypeErrorr    r!   r6   r7   )r   rA   Úvalsr>   r,   ÚaÚbr   r   r   Ú__add__Î   s    &zSerialisable.__add__c             C   sz   |  j  d d ƒ } |  j j | ƒ } xO |  j D]D } | |  j |  j k r. t t |  | ƒ ƒ } t | | | ƒ q. q. W| S)Nr   Údummy)	r1   r7   r   Ú__dict__r    r6   r   r!   Úsetattr)r   ZxmlÚcprL   r3   r   r   r   Ú__copy__Þ   s    zSerialisable.__copy__)rG   rF   Ú__qualname__Ú__doc__r    r:   r6   r   r9   r#   r   r0   Úclassmethodr   r1   r@   rB   rC   rM   rR   rX   r]   r   r   r   r   r      s"   84	r   N)Ú
__future__r   r   Úkeywordr   Ú	frozensetr   Ú r   r   Úsequencer   r	   r
   r0   r   Zopenpyxl.compatr   Zopenpyxl.xml.functionsr   r   r   rN   r8   r   r   r   r   r   Ú<module>   s   