U
    Cd9                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ d	Z	d
Z
G dd deZG dd dede
eZG dd dede
eZdd Zdd ZdS )z3Module containing the urlparse compatibility logic.    )
namedtuple   )compat)
exceptions)misc)normalizers)uri)ParseResultParseResultBytes)schemeuserinfohostportpathqueryfragmentc                   @   s@   e Zd Zdd Zdd Zedd Zedd Zed	d
 ZdS )ParseResultMixinc                    s    fdddD \}}}| j |ks6| j|ks6| j|krh|rDd|}tt|| jt|| j|fS t	| j
tr| j
dS | j
S )Nc                 3   s   | ]} | V  qd S N .0p
attributesr   7/tmp/pip-unpacked-wheel-79v45wuf/rfc3986/parseresult.py	<genexpr>)   s    z7ParseResultMixin._generate_authority.<locals>.<genexpr>r   r   r   z{0}utf-8)r   r   r   formatr   Znormalize_authorityr   to_strencoding
isinstance	authoritybytesdecode)selfr   r   r   r   r   r   r   _generate_authority&   s(    

z$ParseResultMixin._generate_authorityc                 C   s   |   S )z*Shim to match the standard library method.)unsplitr%   r   r   r   geturl>   s    zParseResultMixin.geturlc                 C   s   | j S z#Shim to match the standard library.r   r(   r   r   r   hostnameB   s    zParseResultMixin.hostnamec                 C   s   | j S r*   )r"   r(   r   r   r   netlocG   s    zParseResultMixin.netlocc                 C   s   | j S r*   )r   r(   r   r   r   paramsL   s    zParseResultMixin.paramsN)	__name__
__module____qualname__r&   r)   propertyr,   r-   r.   r   r   r   r   r   %   s   

r   c                	       s   e Zd ZdZdZd fdd	ZedddZedd
dZe	dd Z
ejejejejejejejfddZdddZdddZ  ZS )r	   zImplementation of urlparse compatibility class.

    This uses the URIReference logic to handle compatibility with the
    urlparse.ParseResult class.
    r   r   c
              
      s>   t t| | |pd|pd||p d|p&d||}
|	|
_||
_|
S )zCreate a new ParseResult.N)superr	   __new__r    	reference)clsr   r   r   r   r   r   r   uri_refr    parse_result	__class__r   r   r4   ]   s    

zParseResult.__new__Nc	                 C   s   d}	|dk	r|	|d 7 }	|dk	r(|	|7 }	|dk	r>|	d |7 }	tj||	||||d }
t|
dd\}}}| |
j||||
j|
j|
j|
|d	S )	-Create a ParseResult instance from its parts. N@:{0}r   r"   r   r   r   r    Tstrict	r   r   r   r   r   r   r   r7   r    )	r   r   URIReference	normalizeauthority_fromr   r   r   r   )r6   r   r   r   r   r   r   r   r    r"   r7   r   r   r   
from_partsx   s6    
zParseResult.from_partsTc           	      C   sL   t j||}|s| }t||\}}}| |j||||j|j|j||d	S )a  Parse a URI from the given unicode URI string.

        :param str uri_string: Unicode URI to be parsed into a reference.
        :param str encoding: The encoding of the string provided
        :param bool strict: Parse strictly according to :rfc:`3986` if True.
            If False, parse similarly to the standard library's urlparse
            function.
        :returns: :class:`ParseResult` or subclass thereof
        rB   )	r   rC   from_stringrD   rE   r   r   r   r   )	r6   
uri_stringr    rA   lazy_normalizer5   r   r   r   r   r   r   rG      s    zParseResult.from_stringc                 C   s   | j jS z Return the normalized authority.)r5   r"   r(   r   r   r   r"      s    zParseResult.authorityc              	   C   s   t t|||||||f}i }	|D ]$\}
}|tjkr<t| |
}||	|
< q | |	}| jj|	d ||	d |	d |	d d}tf || j	d|	S )>Create a copy of this instance replacing with specified parts.r   r   r   r   r   r"   r   r   r   r7   r    )
zipPARSED_COMPONENTSr   UseExistinggetattrr&   r5   	copy_withr	   r    )r%   r   r   r   r   r   r   r   r   
attrs_dictnamevaluer"   refr   r   r   rR      s$    



zParseResult.copy_withc                    s<    p| j  ttt fdd| D }tf | j d|S )z+Convert to an instance of ParseResultBytes.c                 3   s&   | ]}t |d r| n|V  qdS )encodeN)hasattrrW   )r   attrr    r   r   r      s   z%ParseResult.encode.<locals>.<genexpr>rM   )r    dictrN   rO   r
   r5   )r%   r    attrsr   rZ   r   rW      s    

	 zParseResult.encodeFc                 C   s<   | }|r2| j r2| j d}|| j}| j|d}|j S )zCreate a URI string from the components.

        :returns: The parsed URI reconstituted as a string.
        :rtype: str
        idnar+   )r   rW   r$   r    rR   r5   r'   )r%   use_idnar8   	hostbytesr   r   r   r   r'      s    
zParseResult.unsplit)r   )NNNNNNNr   )r   TT)N)F)r/   r0   r1   __doc__slotsr4   classmethodrF   rG   r2   r"   r   rP   rR   rW   r'   __classcell__r   r   r9   r   r	   R   s>            (     


r	   c                
       s|   e Zd ZdZd fdd	ZedddZedd	d
Zedd Z	e
je
je
je
je
je
je
jdfddZdddZ  ZS )r
   z<Compatibility shim for the urlparse.ParseResultBytes object.r   Tc              
      sL   t t| | |pd|pd||p d|p&d|p,d|p2d}|	|_||_|
|_|S )z'Create a new ParseResultBytes instance.N)r3   r
   r4   r    r5   rI   )r6   r   r   r   r   r   r   r   r7   r    rI   r8   r9   r   r   r4     s    

zParseResultBytes.__new__Nc
                 C   s   d}
|dk	r|
|d 7 }
|dk	r(|
|7 }
|dk	rB|
d t|7 }
tj||
||||d}|	sd| }tj}t|dd\}}}| ||||||||||||||||||||||	d
S )	r;   r<   Nr=   r>   r?   Tr@   
r   r   r   r   r   r   r   r7   r    rI   )r   intr   rC   rD   r   to_bytesrE   )r6   r   r   r   r   r   r   r   r    rI   r"   r7   rf   r   r   r   rF   "  s>    zParseResultBytes.from_partsc           
      C   sx   t j||}|s| }t||\}}}tj}	| |	|j||	|||	||||	|j||	|j	||	|j
||||d
S )a  Parse a URI from the given unicode URI string.

        :param str uri_string: Unicode URI to be parsed into a reference.
        :param str encoding: The encoding of the string provided
        :param bool strict: Parse strictly according to :rfc:`3986` if True.
            If False, parse similarly to the standard library's urlparse
            function.
        :returns: :class:`ParseResultBytes` or subclass thereof
        rd   )r   rC   rG   rD   rE   r   rf   r   r   r   r   )
r6   rH   r    rA   rI   r5   r   r   r   rf   r   r   r   rG   P  s"    



zParseResultBytes.from_stringc                 C   s   | j j| jS rJ   )r5   r"   rW   r    r(   r   r   r   r"   p  s    zParseResultBytes.authorityc	              	   C   s   t t|||||||f}	i }
|	D ]D\}}|tjkr<t| |}t|ts\t|dr\|| j	}||
|< q | 
|
}tj}| jj||
d | j	||| j	||
d | j	||
d | j	||
d | j	d}|s| }tf || j	|d|
S )rK   rW   r   r   r   r   rL   )r7   r    rI   )rN   rO   r   rP   rQ   r!   r#   rX   rW   r    r&   r   r   r5   rR   rD   r
   )r%   r   r   r   r   r   r   r   rI   r   rS   rT   rU   r"   r   rV   r   r   r   rR   u  s:    




zParseResultBytes.copy_withFc                 C   sZ   | }|r2| j r2| j | j}|d}| j|d}| jrD|jdd}|j }|| jS )zCreate a URI bytes object from the components.

        :returns: The parsed URI reconstituted as a string.
        :rtype: bytes
        r]   r+   F)rI   )r   r$   r    rW   rR   rI   r5   r'   )r%   r^   r8   r   r_   r   r   r   r   r'     s    


zParseResultBytes.unsplit)r   T)	NNNNNNNr   T)r   TT)F)r/   r0   r1   r`   r4   rb   rF   rG   r2   r"   r   rP   rR   r'   rc   r   r   r9   r   r
      s@              -     

)r
   c                 C   s   d  } }}d }| }d| kr,|  dd\}}|drN|dd\}}|d7 }d|krh|dd\}}n|st|rt|}|r|s|}|||fS )Nr=   r   []:)rsplit
startswithsplit)r"   r   r   r   Z
extra_hostrestr   r   r   split_authority  s    
rn   c                    s   z|    W n, tjk
r8   |r$ t| j\}}}Y nX  fdddD \}}}|rzt|}W n tk
r   t|Y nX |||fS )Nc                 3   s   | ]}  |V  qd S r   )getr   Zsubauthorityr   r   r     s    z!authority_from.<locals>.<genexpr>r   )Zauthority_infor   ZInvalidAuthorityrn   r"   re   
ValueErrorZInvalidPort)r5   rA   r   r   r   r   rp   r   rE     s    
rE   N)r`   collectionsr   r<   r   r   r   r   r   __all__rO   objectr   r	   r
   rn   rE   r   r   r   r   <module>   s*   -
  /
  2