B
    ]\,                 @   s   d Z ddlZddlZdej  kr*dk r8n n
ddlZn&dej  krNdk r^n nddlmZ G dd deZd	d
 Z	dd Z
dd ZyeZW n ek
r   eZY nX eefZdddZdd ZdS )z

uritemplate.variable
====================

This module contains the URIVariable class which powers the URITemplate class.

What treasures await you:

- URIVariable class

You see a hammer in front of you.
What do you do?
>

    N)      )r      )   r   )   r   c               @   sj   e Zd ZdZdZdZ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d ZdddZdS )URIVariablea  This object validates everything inside the URITemplate object.

    It validates template expansions and will truncate length as decided by
    the template.

    Please note that just like the :class:`URITemplate <URITemplate>`, this
    object's ``__str__`` and ``__repr__`` methods do not return the same
    information. Calling ``str(var)`` will return the original variable.

    This object does the majority of the heavy lifting. The ``URITemplate``
    object finds the variables in the URI and then creates ``URIVariable``
    objects.  Expansions of the URI are handled by each ``URIVariable``
    object. ``URIVariable.expand()`` returns a dictionary of the original
    variable and the expanded value. Check that method's documentation for
    more information.

    )
+#./;?&|!@z:/?#[]@!$&'()*+,;=c             C   s8   || _ d| _d| _g | _g | _i | _|   |   d S )N )originaloperatorsafe	variablesvariable_namesdefaultsparse
post_parse)selfvar r   q/private/var/folders/pf/vfcx6ndx4k5bb3vdnp68mdb40000gn/T/pip-install-6fjfx5ra/uritemplate/uritemplate/variable.py__init__2   s    zURIVariable.__init__c             C   s   d|  S )NzURIVariable(%s)r   )r   r   r   r   __repr__C   s    zURIVariable.__repr__c             C   s   | j S )N)r   )r   r   r   r   __str__F   s    zURIVariable.__str__c             C   s  | j }| j d tjkr0| j d | _| j dd }| jtjdd krLtj| _|d}x|D ]}d}|}d|krt|dd\}}d}|drd	}|dd
 }d}d|krt|dd\}}t	|}|r|| j
|< | j|||df q\W dd | jD | _dS )zParse the variable.

        This finds the:
            - operator,
            - set of safe characters,
            - variables, and
            - defaults.

        r      Nr   ,=F*T:)explodeprefixc             S   s   g | ]\}}|qS r   r   ).0varname_r   r   r   
<listcomp>t   s    z%URIVariable.parse.<locals>.<listcomp>)r   r   	operatorsr   reservedr   splittupleendswithintr   r   appendr   )r   Zvar_listr   Zdefault_valnamer(   r)   r   r   r   r   I   s2    




zURIVariable.parsec             C   sp   d| _ | j | _| _| jdkr$d| _| jdkr4d| _| jdkrDd| _| jdkrZd| _d| _| jdkrltj| _ d	S )
zSet ``start``, ``join_str`` and ``safe`` attributes.

        After parsing the variable, we need to set up these attributes and it
        only makes sense to do it in a more easily testable way.
        r   r   )r   r	   r   r#   r	   r   r   )r   r	   N)r   r   startjoin_strr   r/   )r   r   r   r   r   v   s    




zURIVariable.post_parsec                s  |dkrdS t |\}}| jt|rv|sv|s2dS |rR| j fdd|D S dfdd|D }d |f S t|s|r|sdS |pt| }|r| jfdd|D S dfdd|D }d |f S |r|r|d| n|}d t|f S  d	 S )
z/Expansion method for the '?' and '&' operators.Nc             3   s    | ]}d  t |f V  qdS )z%s=%sN)quote)r*   v)r5   r   r   r   	<genexpr>   s    z/URIVariable._query_expansion.<locals>.<genexpr>r#   c             3   s   | ]}t | V  qd S )N)r8   )r*   r9   )r   r   r   r:      s    z%s=%sc             3   s*   | ]"\}}d t | t | f V  qdS )z%s=%sN)r8   )r*   kr9   )r   r   r   r:      s   c             3   s*   | ]"\}}d t | t | f V  qdS )z%s,%sN)r8   )r*   r;   r9   )r   r   r   r:      s   r$   )	is_list_of_tuplesr   	list_testr7   join	dict_testsorteditemsr8   )r   r5   valuer(   r)   tuplesrA   r   )r5   r   r   _query_expansion   s8    



zURIVariable._query_expansionc       	         s   | j }| jdks(tdkr,dkr,dS t\}}trr|sr|sLd}|fddD }|rn|S dS ts~|r|pt }d |sd d}| fd	d|D }|r|S dS |rԈd| nt	S )
zSLabel and path expansion method.

        Expands for operators: '/', '.'

        Nr   r   r#   c             3   s    | ]}d k	rt | V  qd S )N)r8   )r*   r9   )r   rB   r   r   r:      s    z4URIVariable._label_path_expansion.<locals>.<genexpr>z%s=%sz%s,%sc             3   s2   | ]*\}}|d k	r t |t |f V  qd S )N)r8   )r*   r;   r9   )
format_strr   r   r   r:      s   )
r7   r   lenr<   r=   r>   r?   r@   rA   r8   )	r   r5   rB   r(   r)   r7   rC   rA   expandedr   )rE   r   rB   r   _label_path_expansion   s.    
z!URIVariable._label_path_expansionc       	         s  | j }| j|dkrdS | jdkr&d}t|\}}t|r|s|rh| fdd|D }|rd|S dS dfdd|D }d |f S t|s|r|pt| }|r|fd	d|D S dfd
d|D }d |f S |r|d| n|}|rd t	|f S  S )z"Expansion method for ';' operator.Nr   r   c             3   s(   | ] }|d k	rd t |f V  qd S )Nz%s=%s)r8   )r*   r9   )r5   r   r   r   r:      s   z3URIVariable._semi_path_expansion.<locals>.<genexpr>r#   c             3   s   | ]}t | V  qd S )N)r8   )r*   r9   )r   r   r   r:      s    z%s=%sc             3   s2   | ]*\}}|d k	rdt | t | f V  qd S )Nz%s=%s)r8   )r*   r;   r9   )r   r   r   r:      s   c             3   s2   | ]*\}}|d k	rdt | t | f V  qd S )Nz%s,%s)r8   )r*   r;   r9   )r   r   r   r:     s   )
r7   r   r   r<   r=   r>   r?   r@   rA   r8   )	r   r5   rB   r(   r)   r7   rC   rA   rG   r   )r5   r   r   _semi_path_expansion   s:    





z URIVariable._semi_path_expansionc                s   |d krd S t |\}}t|r<|s<dfdd|D S t|sH|r~|pVt| }|r`dnd d fdd|D S |r|d | n|}t|jS )Nr#   c             3   s   | ]}t | jV  qd S )N)r8   r   )r*   r9   )r   r   r   r:     s    z0URIVariable._string_expansion.<locals>.<genexpr>z%s=%sz%s,%sc             3   s.   | ]&\}} t |jt |jf V  qd S )N)r8   r   )r*   r;   r9   )rE   r   r   r   r:     s   )r<   r=   r>   r?   r@   rA   r8   r   )r   r5   rB   r(   r)   rC   rA   r   )rE   r   r   _string_expansion  s    
zURIVariable._string_expansionNc             C   s   g }x| j D ]\}}||d}|s@|dkr@|| jkr@| j| }|dkrJqd}| jdkr`| j}n*| jdkrr| j}n| jdkr| j}n| j}||||d |d }|dk	r|| qW d}|r| j	| j
| }| j|iS )a1  Expand the variable in question.

        Using ``var_dict`` and the previously parsed defaults, expand this
        variable and subvariables.

        :param dict var_dict: dictionary of key-value pairs to be used during
            expansion
        :returns: dict(variable=value)

        Examples::

            # (1)
            v = URIVariable('/var')
            expansion = v.expand({'var': 'value'})
            print(expansion)
            # => {'/var': '/value'}

            # (2)
            v = URIVariable('?var,hello,x,y')
            expansion = v.expand({'var': 'value', 'hello': 'Hello World!',
                                  'x': '1024', 'y': '768'})
            print(expansion)
            # => {'?var,hello,x,y':
            #     '?var=value&hello=Hello%20World%21&x=1024&y=768'}

        Nr   )r   r
   )r   r   r   r(   r)   )r   getr   r   rH   rD   rI   rJ   r4   r6   r7   r>   r   )r   Zvar_dictZreturn_valuesr5   optsrB   rG   Z	expansionr   r   r   expand#  s,    



zURIVariable.expand)N)__name__
__module____qualname____doc__r.   r/   r   r    r!   r   r   rD   rH   rI   rJ   rM   r   r   r   r   r      s   -*(0r   c             C   s0   | r$t | ttfr$tdd | D s(dS d| fS )Nc             s   s$   | ]}t |tot|d kV  qdS )r   N)
isinstancer1   rF   )r*   tr   r   r   r:   `  s    z$is_list_of_tuples.<locals>.<genexpr>)FNT)rR   listr1   all)rB   r   r   r   r<   ]  s
    r<   c             C   s   t | ttfS )N)rR   rT   r1   )rB   r   r   r   r=   f  s    r=   c             C   s   t | ttjfS )N)rR   dictcollectionsMutableMapping)rB   r   r   r   r?   j  s    r?   utf-8c             C   s(   t | tr$t| dd d k	r$| |S | S )Nencode)rR   texttypegetattrrZ   )rB   encodingr   r   r   _encodev  s    

r^   c             C   s"   t | tst| } tt| |S )N)rR   stringlikesstrurllibr8   r^   )rB   r   r   r   r   r8   }  s    
r8   )rY   )rQ   rW   sysversion_infora   urllib.parser   objectr   r<   r=   r?   unicoder[   	NameErrorr`   bytesr_   r^   r8   r   r   r   r   <module>   s&   
  D	

