U
    rÎ·hß  ã                   @   s’   d dl 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
mZ d dlmZmZ G dd„ deƒZG d	d
„ d
eƒZdd„ Zdd„ Zddd„ZdS )é    N)Úwarn)ÚStringÚAliasÚSequence)ÚSerialisable)ÚREL_NSÚ
PKG_REL_NS)ÚElementÚ
fromstringc                   @   sN   e Zd ZdZd Zeƒ Zeƒ ZedƒZ	edd�Z
edd�ZedƒZd	dd„ZdS )
ÚRelationshipz'Represents many kinds of relationships.ÚTargetT)Ú
allow_noneÚIdNc                 C   s0   |dk	rd  t|¡}|| _|| _|| _|| _dS )z—
        `type` can be used as a shorthand with the default relationships namespace
        otherwise the `Type` must be a fully qualified URL
        Nz{0}/{1})Úformatr   ÚTyper   Ú
TargetModer   )Úselfr   r   Útyper   r   © r   úC/tmp/pip-unpacked-wheel-49e_hfpc/openpyxl/packaging/relationship.pyÚ__init__!   s    zRelationship.__init__)NNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Útagnamer   r   r   r   Útargetr   r   Úidr   r   r   r   r   r      s   

     ûr   c                   @   sT   e Zd ZdZee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S )ÚRelationshipListÚRelationships)Zexpected_typer   c                 C   s
   || _ d S ©N)r   )r   r   r   r   r   r   ;   s    zRelationshipList.__init__c                 C   s8   | j d d … }| |¡ |js.d t|ƒ¡|_|| _ d S )NúrId{0})r   Úappendr   r   Úlen)r   ÚvalueÚvaluesr   r   r   r"   ?   s
    
zRelationshipList.appendc                 C   s
   t | jƒS r    )r#   r   ©r   r   r   r   Ú__len__G   s    zRelationshipList.__len__c                 C   s
   t | jƒS r    )Úboolr   r&   r   r   r   Ú__bool__K   s    zRelationshipList.__bool__c                 c   s    | j D ]}|j|kr|V  qdS )z«
        Find relationships by content-type
        NB. these content-types namespaced objects and different to the MIME-types
        in the package manifest :-(
        N)r   r   )r   Úcontent_typeÚrr   r   r   ÚfindO   s    

zRelationshipList.findc                 C   s0   | j D ]}|j|kr|  S qtd |¡ƒ‚d S )NzUnknown relationship: {0})r   r   ÚKeyErrorr   )r   Úkeyr+   r   r   r   Ú__getitem__Z   s    


zRelationshipList.__getitem__c                 C   sF   t dtd�}t| jdƒD ](\}}|js2d |¡|_| | ¡ ¡ q|S )Nr   )Úxmlnsé   r!   )r	   r   Ú	enumerater   r   r   r"   Úto_tree)r   ÚtreeÚidxÚrelr   r   r   r3   a   s    zRelationshipList.to_treeN)r   )r   r   r   r   r   r   r   r"   r'   r)   r,   r/   r3   r   r   r   r   r   4   s   

r   c                 C   s&   t  | ¡\}}t  |dd |¡¡}|S )z±
    Convert relative path to absolutes that can be loaded from a zip
    archive.
    The path to be passed in is that of containing object (workbook,
    worksheet, etc.)
    Z_relsz{0}.rels)Ú	posixpathÚsplitÚjoinr   )ÚpathÚfolderÚobjÚfilenamer   r   r   Úget_rels_pathk   s    r>   c           
      C   s¼   |   |¡}t|ƒ}zt |¡}W n, tk
rL   d |¡}t|ƒ tƒ }Y nX t |¡}t 	|¡d }|j
D ]J}|jdkr~qlql|j d¡rœ|jdd… |_qlt ||j¡}	t |	¡|_ql|S )zl
    Normalise dependency file paths to absolute ones

    Relative paths are relative to parent object
    z+{0} contains invalid dependency definitionsr   ZExternalú/r1   N)Úreadr
   r   Ú	from_treeÚ	TypeErrorr   r   r7   Údirnamer8   r   r   r   Ú
startswithr9   Únormpath)
Úarchiver=   ÚsrcÚnodeZrelsÚmsgr;   Úparentr+   Úpthr   r   r   Úget_dependentsw   s$    




rL   c           
      C   s¬   t ||gƒstdƒ‚|dk	r&|| }n,zt| |j¡ƒ}W n tk
rP   Y dS X |j}|  |¡}t|ƒ}| 	|¡}t
|ƒ}	zt| |	ƒ|_W n tk
r¦   g |_Y nX |S )z4
    Get related object based on id or rel_type
    z.Either the id or the content type are requiredN)ÚanyÚ
ValueErrorÚnextr,   Zrel_typeÚStopIterationr   r@   r
   rA   r>   rL   Údepsr-   )
rF   rQ   r   Úclsr6   r:   rG   r4   r<   Z	rels_pathr   r   r   Úget_rel’   s$    


rS   )NN)r7   Úwarningsr   Zopenpyxl.descriptorsr   r   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.xml.constantsr   r   Zopenpyxl.xml.functionsr	   r
   r   r   r>   rL   rS   r   r   r   r   Ú<module>   s    7