ó
]c           @@  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 d e	 f d     YZ d S(   i    (   t   absolute_import(   t   copy(   t   kwlisti   (   t
   Descriptor(   t   _Serialiasable(   t   Sequencet   NestedSequencet   MultiSequencePart(   t
   namespaced(   t   safe_string(   t   Elementt	   localnamet   Serialisablec           B@  sĄ   e  Z d  Z d Z d Z d Z d Z d Z e	 d    Z
 d Z e d    Z d d d d  Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z RS(   s  
    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
    i    c         C@  s
   t   d  S(   N(   t   NotImplementedError(   t   self(    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   tagname)   s    c   
      C@  sY  t  | j  } x; |  j D]0 \ } } | | k r | | | | <| | =q q Wx t |  D]} } | j d  ry | | =qZ | t k rĄ | | | d | <| | =qZ d | k rZ | j d d  } | | | | <| | =qZ qZ W| j rd |  j k r| j | d <n  xI| D]A} t	 |  } | t k r5d | } n  t
 |  | d  } | d k s
t | t  rhq
n  t | d  r| j |  }	 n0 t | j d  r°| j j |  }	 n	 | j }	 t | t  rŐ|	 | | <q
t | t  r| j | g   | | j |	  q
t | t  rA| j | j g   | | j j |	  q
|	 | | <q
W|  |   S(   s(   
        Create object from XML
        t   {t   _t   -t	   attr_textt	   from_treeN(   t   dictt   attribt   __namespaced__t   listt
   startswitht   KEYWORDSt   replacet   textt	   __attrs__R   t   getattrt   Nonet
   isinstancet   propertyt   hasattrR   t   expected_typeR   R   t
   setdefaultt   appendR   t   store(
   t   clst   nodeR   t   keyt   nst   nt   elt   tagt   desct   obj(    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyR   /   sN    

	c         @  sZ  | d  k r |  j } n  | j d  r4 | d } n  t |  |   } t |  d    t |   } x; |  j D]0 \ } } | | k rn | | | | <| | =qn qn Wt | |  } d |  j k rŰ t	 t |  d   | _
 n  xx|  j D]m  t |  j   d   } t |     }	 t | d  r<t |	 d  r<| j |	 _ n  t |	 t  rît | t  r|	 sfqĺ n  | j   |	   g }
 nL t | t  r´|  j | _ | j   |	   }
 n    f 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   i   t	   namespaceR   c         3@  s!   |  ] } | j      Vq d  S(   N(   t   to_tree(   t   .0t   v(   t	   child_tagR0   (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pys	   <genexpr>   s    (   R   R   R   R   R   R   R   R
   R   R	   R   t   __elements__t	   __class__R"   R0   R    t	   seq_typesR   R1   R   t   idx_baseR%   t
   __nested__(   R   R   t   idxR0   t   attrsR)   R*   R,   R.   R/   t   nodesR(   (    (   R4   R0   s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyR1   k   sL    c         c@  sĂ   xź |  j  D]ą } t |  |  } | j d  r; | d } nT | d k r d | k r t |  j |  } t | d t  r | j d d  } q n  | d k r
 | d  k	 r
 | t |  f Vq
 q
 Wd  S(   NR   i   R   t
   hyphenatedR   (   R   R   R   R6   t   FalseR   R   R	   (   R   t   attrt   valueR.   (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __iter__Ą   s    c         C@  sl   |  j  | j  k s t St |   t |  k s2 t Sx3 |  j D]( } t |  |  t | |  k r< t Sq< Wt S(   N(   R6   R>   R   R5   R   t   True(   R   t   otherR,   (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __eq__Ž   s    c         C@  s   |  | k S(   N(    (   R   RC   (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __ne__š   s    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(   Nu   <{0}.{1} object>
Parameters:u   {0}={1}u   , u   
(   t   formatt
   __module__R6   t   __name__R   R5   R   R    R   R   R%   t   reprt   join(   R   t   st   argst   kR3   (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __repr__˝   s    	#c         C@  sk   g  } xR |  j  |  j D]@ } t |  |  } t | t  rJ t |  } n  | j |  q Wt t |   S(   N(   R   R5   R   R    R   t   tupleR%   t   hash(   R   t   fieldsR?   t   val(    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __hash__Í   s    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(   Ns+   Cannot combine instances of different types(   t   typet	   TypeErrorR   R   R5   R6   (   R   RC   t   valsR?   R,   t   at   b(    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __add__Ř   s    &c         C@  sz   |  j  d d  } |  j j |  } xO |  j D]D } | |  j |  j k r. t t |  |   } t | | |  q. q. W| S(   NR   t   dummy(	   R1   R6   R   t   __dict__R   R5   R   R   t   setattr(   R   t   xmlt   cpRM   R3   (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   __copy__č   s    N(   RH   RG   t   __doc__R   R   R9   R5   R   R8   R!   R   R0   t   classmethodR   R1   RA   RD   RE   RN   RS   RY   R_   (    (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyR      s"   <6						N(   t
   __future__R    R   t   keywordR   t	   frozensetR   t    R   R   t   sequenceR   R   R   R0   R   t   openpyxl.compatR	   t   openpyxl.xml.functionsR
   R   R   RO   R7   R   (    (    (    s@   lib/python2.7/site-packages/openpyxl/descriptors/serialisable.pyt   <module>   s   