a
    b                     @   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ZdS )    )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   q/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/openpyxl/descriptors/serialisable.pytagname(   s    zSerialisable.tagnamec           
      C   s  t |j}| jD ]"\}}||v r|| ||< ||= qt|D ]\}|drR||= q<|tv rr|| |d| < ||= q<d|v r<|dd}|| ||< ||= q<|jrd| jv r|j|d< |D ]}t	|}|tv rd| }t
| |d}|du 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 i |S )z(
        Create object from XML
        {_-	attr_textN	from_tree)dictattrib__namespaced__list
startswithKEYWORDSreplacetext	__attrs__r   getattr
isinstancepropertyhasattrr   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 u r| j }|dr$|dd  }t| |}t| dt| }| jD ]"\}}||v rJ|| ||< ||= qJt||}d| jv 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v rj| |	}n|	d u rxqn
|	 }|d ur|| q|S )Nr   r   	namespacer   c                 3   s   | ]}|  V  qd S r   )to_tree).0vZ	child_tagr4   r   r   	<genexpr>       z'Serialisable.to_tree.<locals>.<genexpr>)r   r   r
   r#   r   r   r   r"   r   r!   __elements__	__class__r&   r4   r$   	seq_typesr   r5   r   idx_baser)   
__nested__)r   r   idxr4   attrsr-   r.   r0   r2   r3   nodesr,   r   r8   r   r5   j   sL    







zSerialisable.to_treec                 c   s   | j D ]x}t| |}|dr,|dd  }n4|dkr`d|v r`t| j|}t|ddr`|dd}|dkr|d ur|t|fV  qd S )Nr   r   r   Z
hyphenatedFr   )r"   r#   r   r<   r    r   )r   attrvaluer2   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   r;   r#   )r   otherr0   r   r   r   __eq__   s    
zSerialisable.__eq__c                 C   s
   | |k S r   r   )r   rF   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"   r;   r#   r$   r   r)   reprjoin)r   sargskr7   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"   r;   r#   r$   r   tupler)   hash)r   fieldsrC   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 i |S )Nz+Cannot combine instances of different types)type	TypeErrorr"   r#   r;   r<   )r   rF   valsrC   r0   abr   r   r   __add__   s    



zSerialisable.__add__c                 C   sR   | j dd}| j|}| jD ].}|| j| j vrtt| |}t||| q|S )Ndummy)r   )	r5   r<   r   __dict__r"   r;   r   r#   setattr)r   xmlcprQ   r7   r   r   r   __copy__   s    
zSerialisable.__copy__)NNN)rL   rK   __qualname____doc__r"   r?   r;   r   r>   r%   r   r4   classmethodr   r5   rE   rG   rH   rR   rW   r]   rc   r   r   r   r   r      s&   

;
6r   N)r   keywordr   	frozensetr    r   r   sequencer   r   r	   r4   r
   Zopenpyxl.compatr   Zopenpyxl.xml.functionsr   r   r   rS   r=   r   r   r   r   r   <module>   s   