U
    Ê¼µbÕ1  ã                   @   sH   d Z ddlmZ ddlmZ ddlmZ ddlmZ G dd„ deƒZdS )	z6Module containing the logic for the URIBuilder object.é   )Úcompat)Únormalizers)Úuri)Úuri_referencec                   @   sŽ   e Zd ZdZd!dd„Zdd„ Ze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„ Zdd„ Zdd„ Zdd „ ZdS )"Ú
URIBuildera  Object to aid in building up a URI Reference from parts.

    .. note::

        This object should be instantiated by the user, but it's recommended
        that it is not provided with arguments. Instead, use the available
        method to populate the fields.

    Nc                 C   s.   || _ || _|| _|| _|| _|| _|| _dS )a€  Initialize our URI builder.

        :param str scheme:
            (optional)
        :param str userinfo:
            (optional)
        :param str host:
            (optional)
        :param int port:
            (optional)
        :param str path:
            (optional)
        :param str query:
            (optional)
        :param str fragment:
            (optional)
        N©ÚschemeÚuserinfoÚhostÚportÚpathÚqueryÚfragment)Úselfr   r	   r
   r   r   r   r   © r   ú3/tmp/pip-unpacked-wheel-9bk_1qnx/rfc3986/builder.pyÚ__init__!   s    zURIBuilder.__init__c                 C   s   d}|j | d�S )z0Provide a convenient view of our builder object.z‰URIBuilder(scheme={b.scheme}, userinfo={b.userinfo}, host={b.host}, port={b.port}, path={b.path}, query={b.query}, fragment={b.fragment}))Úb)Úformat)r   Z	formatstrr   r   r   Ú__repr__D   s    ÿzURIBuilder.__repr__c              	   C   s8   t |tjƒst|ƒ}| |j|j|j|j|j|j	|j
d�S )a  Initialize the URI builder from another URI.

        Takes the given URI reference and creates a new URI builder instance
        populated with the values from the reference. If given a string it will
        try to convert it to a reference before constructing the builder.
        r   )Ú
isinstancer   ÚURIReferencer   r   r	   r
   r   r   r   r   )ÚclsÚ	referencer   r   r   Úfrom_uriM   s    ùzURIBuilder.from_uric              	   C   s,   t  |¡}t|| j| j| j| j| j| jd�S )a“  Add a scheme to our builder object.

        After normalizing, this will generate a new URIBuilder instance with
        the specified scheme and all other attributes the same.

        .. code-block:: python

            >>> URIBuilder().add_scheme('HTTPS')
            URIBuilder(scheme='https', userinfo=None, host=None, port=None,
                    path=None, query=None, fragment=None)

        r   )	r   Znormalize_schemer   r	   r
   r   r   r   r   )r   r   r   r   r   Ú
add_schemea   s    
ùzURIBuilder.add_schemec              	   C   sV   |dkrt dƒ‚t |¡}|dk	r4d |t |¡¡}t| j|| j| j| j	| j
| jd�S )aë  Add credentials as the userinfo portion of the URI.

        .. code-block:: python

            >>> URIBuilder().add_credentials('root', 's3crete')
            URIBuilder(scheme=None, userinfo='root:s3crete', host=None,
                    port=None, path=None, query=None, fragment=None)

            >>> URIBuilder().add_credentials('root', None)
            URIBuilder(scheme=None, userinfo='root', host=None,
                    port=None, path=None, query=None, fragment=None)
        NzUsername cannot be Nonez{}:{}r   )Ú
ValueErrorr   Znormalize_usernamer   Znormalize_passwordr   r   r
   r   r   r   r   )r   ÚusernameÚpasswordr	   r   r   r   Úadd_credentialsy   s"    
þùzURIBuilder.add_credentialsc              	   C   s(   t | j| jt |¡| j| j| j| jd�S )a  Add hostname to the URI.

        .. code-block:: python

            >>> URIBuilder().add_host('google.com')
            URIBuilder(scheme=None, userinfo=None, host='google.com',
                    port=None, path=None, query=None, fragment=None)

        r   )	r   r   r	   r   Únormalize_hostr   r   r   r   )r   r
   r   r   r   Úadd_hostš   s    
ùzURIBuilder.add_hostc              	   C   s\   t |ƒ}|dk rtd |¡ƒ‚|dkr4td |¡ƒ‚t| j| j| jd |¡| j| j| j	d�S )aœ  Add port to the URI.

        .. code-block:: python

            >>> URIBuilder().add_port(80)
            URIBuilder(scheme=None, userinfo=None, host=None, port='80',
                    path=None, query=None, fragment=None)

            >>> URIBuilder().add_port(443)
            URIBuilder(scheme=None, userinfo=None, host=None, port='443',
                    path=None, query=None, fragment=None)

        é    z5ports are not allowed to be negative. You provided {}iÿÿ  z>ports are not allowed to be larger than 65535. You provided {}z{}r   )
Úintr   r   r   r   r	   r
   r   r   r   )r   r   Zport_intr   r   r   Úadd_port®   s,    ÿÿþÿùzURIBuilder.add_portc              	   C   s<   |  d¡sd |¡}t| j| j| j| jt |¡| j	| j
d�S )aÛ  Add a path to the URI.

        .. code-block:: python

            >>> URIBuilder().add_path('sigmavirus24/rfc3985')
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/sigmavirus24/rfc3986', query=None, fragment=None)

            >>> URIBuilder().add_path('/checkout.php')
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/checkout.php', query=None, fragment=None)

        ú/z/{}r   )Ú
startswithr   r   r   r	   r
   r   r   Únormalize_pathr   r   )r   r   r   r   r   Úadd_pathÕ   s    

ùzURIBuilder.add_pathc                 C   s,   | j pd}d | d¡| d¡¡}|  |¡S )aò  Extend the existing path value with the provided value.

        .. versionadded:: 1.5.0

        .. code-block:: python

            >>> URIBuilder(path="/users").extend_path("/sigmavirus24")
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/users/sigmavirus24', query=None, fragment=None)

            >>> URIBuilder(path="/users/").extend_path("/sigmavirus24")
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/users/sigmavirus24', query=None, fragment=None)

            >>> URIBuilder(path="/users/").extend_path("sigmavirus24")
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/users/sigmavirus24', query=None, fragment=None)

            >>> URIBuilder(path="/users").extend_path("sigmavirus24")
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path='/users/sigmavirus24', query=None, fragment=None)

        Ú z{}/{}r%   )r   r   ÚrstripÚlstripr(   )r   r   Zexisting_pathr   r   r   Úextend_pathð   s    
zURIBuilder.extend_pathc              	   C   s2   t  t |¡¡}t| j| j| j| j| j	|| j
d�S )aæ  Generate and add a query a dictionary or list of tuples.

        .. code-block:: python

            >>> URIBuilder().add_query_from({'a': 'b c'})
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query='a=b+c', fragment=None)

            >>> URIBuilder().add_query_from([('a', 'b c')])
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query='a=b+c', fragment=None)

        r   )r   Únormalize_queryr   Ú	urlencoder   r   r	   r
   r   r   r   )r   Úquery_itemsr   r   r   r   Úadd_query_from  s    ùzURIBuilder.add_query_fromc                 C   s4   t  | jpd¡}t|tƒs&t| ¡ ƒ}|  || ¡S )a4  Extend the existing query string with the new query items.

        .. versionadded:: 1.5.0

        .. code-block:: python

            >>> URIBuilder(query='a=b+c').extend_query_with({'a': 'b c'})
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query='a=b+c&a=b+c', fragment=None)

            >>> URIBuilder(query='a=b+c').extend_query_with([('a', 'b c')])
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query='a=b+c&a=b+c', fragment=None)
        r)   )r   Ú	parse_qslr   r   ÚlistÚitemsr0   )r   r/   Zoriginal_query_itemsr   r   r   Úextend_query_with'  s    
zURIBuilder.extend_query_withc              	   C   s(   t | j| j| j| j| jt |¡| jd�S )a  Add a pre-formated query string to the URI.

        .. code-block:: python

            >>> URIBuilder().add_query('a=b&c=d')
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query='a=b&c=d', fragment=None)

        r   )	r   r   r	   r
   r   r   r   r-   r   )r   r   r   r   r   Ú	add_query<  s    
ùzURIBuilder.add_queryc              
   C   s(   t | j| j| j| j| j| jt |¡d�S )a  Add a fragment to the URI.

        .. code-block:: python

            >>> URIBuilder().add_fragment('section-2.6.1')
            URIBuilder(scheme=None, userinfo=None, host=None, port=None,
                    path=None, query=None, fragment='section-2.6.1')

        r   )	r   r   r	   r
   r   r   r   r   Znormalize_fragment)r   r   r   r   r   Úadd_fragmentP  s    
ùzURIBuilder.add_fragmentc                 C   s,   t  | jt | j| j| jf¡| j| j	| j
¡S )a>  Create a URIReference from our builder.

        .. code-block:: python

            >>> URIBuilder().add_scheme('https').add_host('github.com'
            ...     ).add_path('sigmavirus24/rfc3986').finalize().unsplit()
            'https://github.com/sigmavirus24/rfc3986'

            >>> URIBuilder().add_scheme('https').add_host('github.com'
            ...     ).add_path('sigmavirus24/rfc3986').add_credentials(
            ...     'sigmavirus24', 'not-re@l').finalize().unsplit()
            'https://sigmavirus24:not-re%40l@github.com/sigmavirus24/rfc3986'

        )r   r   r   r   Znormalize_authorityr	   r
   r   r   r   r   ©r   r   r   r   Úfinalized  s    ÿùzURIBuilder.finalizec                 C   s   |   ¡  ¡ S )zËGenerate the URL from this builder.

        .. versionadded:: 1.5.0

        This is an alternative to calling :meth:`finalize` and keeping the
        :class:`rfc3986.uri.URIReference` around.
        )r8   Zunsplitr7   r   r   r   Úgeturl}  s    zURIBuilder.geturl)NNNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Úclassmethodr   r   r   r!   r$   r(   r,   r0   r4   r5   r6   r8   r9   r   r   r   r   r      s0          ø
#	
!'r   N)r=   r)   r   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s
   