U
    ~fh                     @   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
 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)ElementList)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-eyn_au5k/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                       sH   e Zd ZdZeZ fddZdd Zdd Zdd	 Z	 fd
dZ
  ZS )RelationshipListZRelationshipsc                    s&   t  | |js"dt|  |_d S )NZrId)superappendr   len)r   value	__class__r   r   r!   ;   s    zRelationshipList.appendc                 c   s   | 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   content_typerr   r   r   findA   s    
zRelationshipList.findc                 C   s.   | D ]}|j |kr|  S qtd|d S )NzUnknown relationship: {0})r   KeyErrorr   )r   keyr'   r   r   r   getL   s    

zRelationshipList.getc                 C   s   dd | D S )z,Return a dictionary of relations keyed by idc                 S   s   i | ]}|j |qS r   )r   ).0r'   r   r   r   
<dictcomp>U   s      z,RelationshipList.to_dict.<locals>.<dictcomp>r   )r   r   r   r   to_dictS   s    zRelationshipList.to_dictc                    s   t   }|dt |S )Nxmlns)r    to_treesetr	   )r   treer$   r   r   r0   X   s    
zRelationshipList.to_tree)r   r   r   r   r   Zexpected_typer!   r(   r+   r.   r0   __classcell__r   r   r$   r   r   5   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_path^   s    r;   c           
      C   s   |  |}t|}zt|}W n, tk
rL   d|}t| t }Y nX t|}t	|d }|D ]J}|j
dkr|qjqj|jdr|jdd |_qjt||j}	t|	|_qj|S )zl
    Normalise dependency file paths to absolute ones

    Relative paths are relative to parent object
    z+{0} contains invalid dependency definitionsr   ZExternal/   N)readr   r   	from_tree	TypeErrorr   r   r4   dirnamer5   r   r   
startswithr6   normpath)
archiver:   srcnodeZrelsmsgr8   parentr'   pthr   r   r   get_dependentsj   s$    



rJ   c           
      C   s   t ||gstd|dk	r(||}n,zt||j}W n tk
rR   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
ValueErrorr+   nextr(   Zrel_typeStopIterationr   r>   r   r?   r;   rJ   depsr)   )
rD   rO   r   clsrelr7   rE   r2   r9   Z	rels_pathr   r   r   get_rel   s$    

rR   )NN)r4   warningsr   Zopenpyxl.descriptorsr   r   r   Z!openpyxl.descriptors.serialisabler   Zopenpyxl.descriptors.containerr   Zopenpyxl.xml.constantsr   r	   Zopenpyxl.xml.functionsr
   r   r   r   r;   rJ   rR   r   r   r   r   <module>   s    )