o
    g                     @   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 N)NotImplementedError)self r   [/var/www/html/api-tag/env/lib/python3.10/site-packages/openpyxl/descriptors/serialisable.pytagname(   s   zSerialisable.tagnamec           
      C   s  t |j}| jD ]\}}||v r|| ||< ||= qt|D ].}|dr)||= q|tv r9|| |d| < ||= qd|v rL|dd}|| ||< ||= q|jrZd| jv rZ|j|d< |D ]o}t	|}|tv rjd| }t
| |d}|du syt|trzq\t|dr||}	nt|jdr|j|}	n|j}	t|tr|	||< q\t|tr||g  || |	 q\t|tr||jg  ||j |	 q\|	||< q\| di |S )z(
        Create object from XML
        {_-	attr_textN	from_treer   )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   .   sR   








zSerialisable.from_treec                    s  |d u r| j }|dr|dd  }t| |}t| dt| }| jD ]\}}||v r6|| ||< ||= q%t||}d| jv rItt| d|_	| j
D ]x t| j d }t|  }	t|drht|	drh|j|	_t|	trt|tr~|	suqL| |	g}
nt|tr| j|_| |	}
n
 fdd|	D }
|
D ]}|| qqL | jv r| |	}n
|	d u rqL|	 }|d ur|| qL|S )Nr   r   	namespacer   c                 3   s    | ]	}|  V  qd S r   )to_tree).0v	child_tagr4   r   r   	<genexpr>   s    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   sR   










zSerialisable.to_treec                 c   s    | j D ]<}t| |}|dr|dd  }n|dkr1d|v r1t| j|}t|ddr1|dd}|dkr@|d ur@|t|fV  qd S )Nr   r   r   
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   rG   r   r   r   __ne__   s   
zSerialisable.__ne__c                 C   sn   d | j| jj}g }| j| j D ]}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rt|}|| qtt|S r   )r"   r;   r#   r$   r   tupler)   hash)r   fieldsrD   valr   r   r   __hash__   s   

zSerialisable.__hash__c                 C   s   t | t |krtdi }| jD ]}t| |pt||||< q| jD ]}t| |}t||}|r:|r:|| ||< q#|p=|||< q#| jdi |S )Nz+Cannot combine instances of different typesr   )type	TypeErrorr"   r#   r;   r<   )r   rG   valsrD   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cprR   r7   r   r   r   __copy__   s   
zSerialisable.__copy__)NNN)rM   rL   __qualname____doc__r"   r?   r;   r   r>   r%   r   r4   classmethodr   r5   rF   rH   rI   rS   rX   r^   rd   r   r   r   r   r      s(    


;6r   )	metaclassN)r   keywordr   	frozensetr    r   r   sequencer   r   r	   r4   r
   openpyxl.compatr   openpyxl.xml.functionsr   r   r   rT   r=   r   r   r   r   r   <module>   s   