o
    iBC                     @   s0  d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ G dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZdS )#z=Process URI templates per http://tools.ietf.org/html/rfc6570.    N)AnyDictIterableListOptionalTupleUnioncast   )CharsetVariablec                   @   s:   e Zd ZU dZeed< deddfddZdefddZdS )	ExpansionFailedErrorz&Exception thrown when expansions fail.variablereturnNc                 C   s
   || _ d S Nr   )selfr    r   R/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/uri_template/expansions.py__init__   s   
zExpansionFailedError.__init__c                 C   s
   d| j  S )Convert to string.zBad expansion: r   r   r   r   r   __str__   s   
zExpansionFailedError.__str__)__name__
__module____qualname____doc__str__annotations__r   r   r   r   r   r   r   
   s
   
 r   c                   @   s  e Zd ZdZd/ddZedee fddZedee	 fdd	Z
d
e	de	dede	fddZd
e	de	fddZdee	ef de	fddZde	de	d
e	de	fddZdede	d
e	de	de	dede	fddZdede	deee	f dede	de	de	dedee	 fdd Zdede	d!edede	de	de	dedee	 fd"d#Z	'd0dede	d
ede	de	de	dedee	 fd(d)Zd*ee	ef dee	 fd+d,Zd*ee	ef de	fd-d.ZdS )1	Expansionz`
    Base class for template expansions.

    https://tools.ietf.org/html/rfc6570#section-3
    r   Nc                 C   s   d S r   r   r   r   r   r   r      s   zExpansion.__init__c                 C      g S )z$Get all variables in this expansion.r   r   r   r   r   	variables!      zExpansion.variablesc                 C   r!   )z1Get the names of all variables in this expansion.r   r   r   r   r   variable_names&   r#   zExpansion.variable_namesvaluelegalpct_encodedc           	      C   s   d}d}|t |k rn|| }||v r||7 }nM|rFd|krF|d t |k rF||d  tjv rF||d  tjv rF||||d  7 }|d7 }n|d}|D ]}|dtjt|d   tj|d   7 }qM|d7 }|t |k s
|S )	z"Encode a string into legal values. r   %   r
      utf8   )lenr   	HEX_DIGITencodeint)	r   r%   r&   r'   outputindex	codepointr,   byter   r   r   _encode+   s$   


*zExpansion._encodec                 C   s   |  |tjdS )!Encode a value into uri encoding.F)r6   r   
UNRESERVEDr   r%   r   r   r   _uri_encode_value@   s   zExpansion._uri_encode_valuenamec                 C   s"   |r|  t|tjtj dS dS )z)Encode a variable name into uri encoding.Tr(   )r6   r   r   r8   RESERVED)r   r;   r   r   r   _uri_encode_nameD   s   "zExpansion._uri_encode_nameprefixjoinerc                 C   s   |r|| | S |S )zJoin a prefix to a value.r   )r   r>   r?   r%   r   r   r   _joinH   s   zExpansion._joinr   firstc              	   C   sH   |j r|stt|| ||| |d|j  S | ||| |S )z%Encode a string value for a variable.N)
max_lengthr   r   r@   r:   r   r   r;   r%   r>   r?   rA   r   r   r   _encode_strN   s
   zExpansion._encode_strkeyitemdelimc	           	   	   C   sj   |j rdnd}|jr| |}|r|s|d | d n|}n
| |d| |}| |t|||||dS )"Encode a dict item for a variable.=,[].F)explodearrayr=   r@   _encode_varr   	r   r   r;   rE   rF   rG   r>   r?   rA   r   r   r   _encode_dict_itemV   s   
zExpansion._encode_dict_itemr3   c	           	   	   C   sN   |j r|r|d t| d nd}| |d||||dS | |||||ddS )"Encode a list item for a variable.rK   rL   r(   FrM   )rO   r   rP   	r   r   r;   r3   rF   rG   r>   r?   rA   r   r   r   _encode_list_itema   s   zExpansion._encode_list_itemrJ   r(   rI   Tc           	         s   t trS t tjjr8tr6 fdd D } dd |D S dS t tjj	r`tr^ fddt
D } dd |D S dS t trst S tS )zEncode a variable.c                    s(   g | ]} ||  qS r   )rR   ).0rE   rG   rA   r?   r;   r>   r   r%   r   r   r   
<listcomp>p   s     z)Expansion._encode_var.<locals>.<listcomp>c                 S      g | ]}|d ur|qS r   r   rV   rF   r   r   r   rX   r       Nc                    s(   g | ]\}} || qS r   )rU   )rV   r3   rF   )rG   rA   r?   r;   r>   r   r   r   r   rX   v   s    c                 S   rY   r   r   rZ   r   r   r   rX   x   r[   )
isinstancer   rD   collectionsabcMappingr.   keysjoinSequence	enumerateboollower)	r   r   r;   r%   rG   r>   r?   rA   encoded_itemsr   rW   r   rP   i   s&   

zExpansion._encode_varvaluesc                 C      dS )zExpand values.Nr   r   rg   r   r   r   expand      zExpansion.expandc                 C   rh   )zPerform partial expansion.r(   r   ri   r   r   r   partial   rk   zExpansion.partial)r   N)rJ   r(   rI   T)r   r   r   r   r   propertyr   r   r"   r   r$   rd   r6   r:   r   r1   r=   r@   rD   r   r   rR   rU   rP   r   rj   rl   r   r   r   r   r       s`    
&

	
r    c                       s`   e Zd ZU dZeed< deddf fddZdeeef de	e fdd	Z
defd
dZ  ZS )LiteralzS
    A literal expansion.

    https://tools.ietf.org/html/rfc6570#section-3.1
    r%   r   Nc                    s   t    || _d S r   )superr   r%   r9   	__class__r   r   r      s   

zLiteral.__init__rg   c                 C   s   |  | jtjtj dS )zPerform exansion.T)r6   r%   r   r8   r<   ri   r   r   r   rj      s   zLiteral.expandc                 C   s   | j S )r   )r%   r   r   r   r   r      s   zLiteral.__str__)r   r   r   r   r   r   r   r   r   r   rj   r   __classcell__r   r   rp   r   rn      s   
 rn   c                       s   e Zd ZU dZdZdZdZdZdZe	e
 ed< dZeed< deddf fd	d
Zedee
 fddZedee fddZde
dedee fddZdeeef dee fddZdeeef defddZdefddZ  ZS )ExpressionExpansionzd
    Base class for expression expansions.

    https://tools.ietf.org/html/rfc6570#section-3.2
    r(   rJ   varstrailing_joinerr"   r   Nc                    sJ   t    |r|d dv r|d | _|d d }dd |dD | _d S )N)rJ   rM   /;&c                 S      g | ]}t |qS r   r   rV   varr   r   r   rX          z0ExpressionExpansion.__init__.<locals>.<listcomp>rJ   )ro   r   ru   splitrt   r   r"   rp   r   r   r      s
   

zExpressionExpansion.__init__c                 C   s
   t | jS )zGet all variables.)listrt   r   r   r   r   r"      s   
zExpressionExpansion.variablesc                 C   s   dd | j D S )zGet names of all variables.c                 S   s   g | ]}|j qS r   )r;   r{   r   r   r   rX      s    z6ExpressionExpansion.variable_names.<locals>.<listcomp>)rt   r   r   r   r   r$      s   z"ExpressionExpansion.variable_namesr   r%   c                 C   s   |  || |j|S )Expand a single variable.)rP   r=   r;   r   r   r%   r   r   r   _expand_var      zExpressionExpansion._expand_varrg   c                 C   sp   g }| j D ]}||j|j}|dur"| ||}|dur"|| q|r6| js+| jnd| j	| | j S dS )z*Expand all variables, skip missing values.Nr(   )
rt   getr;   defaultr   appendru   output_prefix
var_joinerra   )r   rg   expanded_varsr|   r%   expanded_varr   r   r   rj      s   

zExpressionExpansion.expandc              	   C   st  g }g }g }| j D ]9}||j|j}|dur2| ||}|dur1|r,|d|f g }|| q	|r=||df g }|| q	|rL||df |rU|d|f d}d}	t|D ]Z\}
\}}|
t|d k}|r||	rv| jsv| j	nd| j
| | j 7 }n2||	r|s| j	n|s| j
ndd |	r| jn| j ddd ttt |D  |s| jnd d	 7 }d
}	q]|S )z=Expand all variables, replace missing values with expansions.Nr(   Tr
   {rJ   c                 S   rz   r   r   r{   r   r   r   rX      r}   z/ExpressionExpansion.partial.<locals>.<listcomp>}F)rt   r   r;   r   r   r   rc   r.   ru   r   r   ra   operatorpartial_operatorr	   r   r   partial_joiner)r   rg   r   missing_varsresultr|   r%   r   r2   rA   r3   expandedmissinglastr   r   r   rl      sX   


zExpressionExpansion.partialc                 C   s*   d| j  ddd | jD  | j d S )r   r   rJ   c                 S   rz   r   r   r{   r   r   r   rX      r}   z/ExpressionExpansion.__str__.<locals>.<listcomp>r   )r   ra   rt   ru   r   r   r   r   r      s   *zExpressionExpansion.__str__)r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   rm   r   r"   r$   r   r   r   r   rj   rl   r   rr   r   r   rp   r   rs      s$   
 'rs   c                       s*   e Zd ZdZdeddf fddZ  ZS )SimpleExpansionz`
    Simple String expansion {var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.2

    r"   r   Nc                       t  | d S r   ro   r   r   rp   r   r   r        zSimpleExpansion.__init__)r   r   r   r   r   r   rr   r   r   rp   r   r      s    r   c                       sD   e Zd ZdZdZdZdeddf fddZd	edefd
dZ  Z	S )ReservedExpansionz[
    Reserved Expansion {+var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.3
    +,+r"   r   Nc                       t  |dd   d S Nr
   r   r   rp   r   r   r        zReservedExpansion.__init__r%   c                 C   s   |  |tjtj dS )r7   T)r6   r   r8   r<   r9   r   r   r   r:     r   z#ReservedExpansion._uri_encode_value)
r   r   r   r   r   r   r   r   r:   rr   r   r   rp   r   r   	  s    r   c                       2   e Zd ZdZdZdZdeddf fddZ  ZS )FragmentExpansionz[
    Fragment Expansion {#var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.4
    #r"   r   Nc                    r   r   r   r   rp   r   r   r   %  r   zFragmentExpansion.__init__	r   r   r   r   r   r   r   r   rr   r   r   rp   r   r     
    r   c                       X   e Zd ZdZdZdZdZdZdZde	ddf fddZ
ded	edee	 fd
dZ  ZS )LabelExpansionzh
    Label Expansion with Dot-Prefix {.var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.5
    rM   r"   r   Nc                    r   r   r   r   rp   r   r   r   6  r   zLabelExpansion.__init__r   r%   c                 C   (   | j || |j||jrddS ddS r   rM   rJ   rG   rP   r=   r;   rN   r   r   r   r   r   9  
   zLabelExpansion._expand_varr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   rp   r   r   )      "r   c                       r   )PathExpansionz_
    Path Segment Expansion {/var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.6
    rw   r"   r   Nc                    r   r   r   r   rp   r   r   r   L  r   zPathExpansion.__init__r   r%   c                 C   r   )r   rw   rJ   r   r   r   r   r   r   r   O  r   zPathExpansion._expand_varr   r   r   rp   r   r   ?  r   r   c                       s   e Zd ZdZdZdZdZdZdZde	ddf fddZ
ded	e	d
ede	de	dede	f fddZded	e	deee	f dede	de	de	dedee	 fddZded	e	dedede	de	de	dedee	 fddZded
edee	 fddZ  ZS )PathStyleExpansionzg
    Path-Style Parameter Expansion {;var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.7
    rx   r"   r   Nc                    r   r   r   r   rp   r   r   r   b  r   zPathStyleExpansion.__init__r   r;   r%   r>   r?   rA   c                    sN   |j r|r|r|d | d n|}n
|jr| |d|}t ||||||S )zEncode a string for a variable.rK   rL   rM   )rO   rN   r@   ro   rD   rC   rp   r   r   rD   e  s   zPathStyleExpansion._encode_strrE   rF   rG   c	           	   	   C   s   |j r'|r|r|d | d n|}|r!|s!|d | | d }n!| |}n|jr6|s3| |d|nd}n| |d| |}d}| ||j sM| |nd||||dS )rH   rK   rL   rM   r(   rJ   F)rO   r=   rN   r@   rP   rQ   r   r   r   rR   n  s   z$PathStyleExpansion._encode_dict_itemr3   c	           	   	   C   s`   |j r|r|r|d | d n|}| |t|||||dS | ||||||jr,ddS ddS )rS   rK   rL   FrI   rM   )rO   rP   r   rN   rT   r   r   r   rU     s
   $z$PathStyleExpansion._encode_list_itemc                 C   sX   |j r| j|| |j|ddS | j|| |j|dd}|r)| |jd | S |jS )r   rx   r   rJ   rI   rN   rP   r=   r;   r   r   r   r   r     s   zPathStyleExpansion._expand_var)r   r   r   r   r   r   r   r   r   r   r   r   r   rd   rD   r   r1   r   rR   rU   r   rr   r   r   rp   r   r   U  s@    *	

"	r   c                       sX   e Zd ZdZdZdZdZdZdZde	ddf fddZ
d	ed
edee	 fddZ  ZS )FormStyleQueryExpansionzc
    Form-Style Query Expansion {?var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.8
    ?ry   r"   r   Nc                    r   r   r   r   rp   r   r   r     r   z FormStyleQueryExpansion.__init__r   r%   c                 C   sZ   |j r| j|| |j|ddS | j|| |j|dd}|dur+| |jd | S dS )r   ry   r   rJ   NrI   r   r   r   r   r   r     s    z#FormStyleQueryExpansion._expand_varr   r   r   rp   r   r     r   r   c                       r   )FormStyleQueryContinuationzf
    Form-Style Query Continuation {&var}.

    https://tools.ietf.org/html/rfc6570#section-3.2.9
    ry   r"   r   Nc                    r   r   r   r   rp   r   r   r     r   z#FormStyleQueryContinuation.__init__r   r   r   rp   r   r     r   r   c                       sL   e Zd ZdZdZdZdeddf fddZded	e	de
e fd
dZ  ZS )CommaExpansionzn
    Label Expansion with Comma-Prefix {,var}.

    Non-standard extension to support partial expansions.
    rJ   r"   r   Nc                    r   r   r   r   rp   r   r   r     r   zCommaExpansion.__init__r   r%   c                 C   r   r   r   r   r   r   r   r     r   zCommaExpansion._expand_varr   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   rp   r   r         "r   c                       sL   e Zd ZdZdZdZdeddf fddZd	ed
e	de
e fddZ  ZS )ReservedCommaExpansionzr
    Reserved Expansion with comma prefix {,+var}.

    Non-standard extension to support partial expansions.
    r   rJ   r"   r   Nc                    r   r   r   r   rp   r   r   r     r   zReservedCommaExpansion.__init__r   r%   c                 C   r   r   r   r   r   r   r   r     r   z"ReservedCommaExpansion._expand_varr   r   r   rp   r   r     r   r   )r   r]   typingr   r   r   r   r   r   r   r	   charsetr   r   r   	Exceptionr   objectr    rn   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s&    (q_<