U
    j5{i'%  ã                   @   s¼  d Z ddlmZ zddlZ[W n& ek
rD   ddlmZ dZY �ntX ddlm	Z
 ddlmZmZ ddlmZmZ dd	lm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m Z  ddlm!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z)m*Z*m+Z, dZedƒZ-eede-f ge-f Z.ze/ W n e0k
�rB   e1Z/Y nX dd„ Z2da3e#d)dd„ƒZ4e#d*dd„ƒZ5e#d+dd„ƒZ6e#d,dd „ƒZ7d!d"„ Z8da9e#d#d$„ ƒZ:e#d%d&„ ƒZ;e#d'd(„ ƒZ<dS )-z
Hypothesis strategies.
é    )Úabsolute_importN)ÚTuple© )Úreader)ÚdirnameÚjoin)Úascii_lettersÚdigits)Ú
maxunicode)ÚCallableÚIterableÚListÚOptionalÚSequenceÚTextÚTypeVarÚcast)Úopené   )Ú
DecodedURLÚ
EncodedURL)Úassume)Ú	compositeÚintegersÚlistsÚsampled_fromÚtext)Ú	IDNAErrorÚcheck_labelÚencode)Údecoded_urlsÚencoded_urlsÚhostname_labelsÚ	hostnamesÚ	idna_textÚpathsÚport_numbersÚT.c               	   C   sÞ   t sÚg } tttƒdƒ}t|ƒ�¬}tdd„ |D ƒdd�}t|ƒ |D ]‚}|\}}}|dkrZqB|d  dd	¡}t|ƒd	kr„| 	|d ¡ d
d„ |D ƒ\}	}
t
|	|
d	 ƒD ]}|tkr´ qB|  	t|ƒ¡ q¤qBW 5 Q R X d | ¡a t S )z>
        Returns a string containing IDNA characters.
        zidna-tables-properties.csv.gzc                 s   s   | ]}|  d ¡V  qdS )úutf-8N)Údecode)Ú.0Úliner   r   ú8/tmp/pip-unpacked-wheel-rqym3v4w/hyperlink/hypothesis.pyÚ	<genexpr>Q   s     z"idna_characters.<locals>.<genexpr>ú,)Ú	delimiterÚPVALIDr   ú-r   c                 s   s   | ]}t |d ƒV  qdS )é   N)Úint)r*   Úir   r   r,   r-   b   s     Ú )Ú_idnaCharactersr   r   Ú__file__Ú	open_gzipÚ
csv_readerÚnextÚsplitÚlenÚappendÚranger
   Úunichr)ÚresultZdataFileNameZdataFiler   ÚrowÚcodesÚpropÚdescriptionZstartEndÚstartÚendr4   r   r   r,   Úidna_characters?   s4     ÿ
þ

rG   r5   c                 C   sl   t ƒ }|dkst‚|dk	r&|dks&t‚tt| t|||d�ƒƒ}zt|ƒ W n tk
rf   tdƒ Y nX |S )a(  
        A strategy which generates IDNA-encodable text.

        @param min_size: The minimum number of characters in the text.
            C{None} is treated as C{0}.

        @param max_size: The maximum number of characters in the text.
            Use C{None} for an unbounded size.
        r   N©Úmin_sizeÚmax_sizeÚalphabetF)rG   ÚAssertionErrorr   r   r   Úidna_encoder   r   )ÚdrawrI   rJ   rK   r@   r   r   r,   r$   o   s    þr$   Fc                 C   s$   |r
d}nd}t t| t|dd�ƒƒS )z†
        A strategy which generates port numbers.

        @param allow_zero: Whether to allow port C{0} as a possible value.
        r   r   iÿÿ  )Ú	min_valueZ	max_value)r   r3   r   )rN   Ú
allow_zerorO   r   r   r,   r&   �   s    r&   Tc              	   C   sº   |rht t| tddd�ƒƒ}z| d¡ W qŒ tk
rd   t| d¡ƒdtdƒ kr`|dd… }q8Y qŒX n$t t| tddttt d	 ƒd
�ƒƒ}zt	|ƒ W n t
k
r´   tdƒ Y nX |S )zÀ
        A strategy which generates host name labels.

        @param allow_idn: Whether to allow non-ASCII characters as allowed by
            internationalized domain names (IDNs).
        r   é?   ©rI   rJ   ÚasciiÚpunycodezxn--Néÿÿÿÿr1   rH   F)r   r   r$   r   ÚUnicodeEncodeErrorr<   r   r   r	   r   ÚUnicodeErrorr   )rN   Ú	allow_idnÚlabelr   r   r,   r"   Ÿ   s,    	ýÿþr"   c              	      s„   t t| t|d� ‡ fdd„¡ƒƒg}|t tt | tt|d�ddd�ƒƒ7 }tdd„ |D ƒƒt|ƒ d d	krz|d
d… }qJd |¡S )aD  
        A strategy which generates host names.

        @param allow_leading_digit: Whether to allow a leading digit in host
            names; they were not allowed prior to RFC 1123.

        @param allow_idn: Whether to allow non-ASCII characters as allowed by
            internationalized domain names (IDNs).
        )rX   c                    s   ˆ rdS | d t kS )NTr   )r	   )Úl©Úallow_leading_digitr   r,   Ú<lambda>ß   s    zhostnames.<locals>.<lambda>r   é   rR   c                 s   s   | ]}t |ƒV  qd S )N)r<   )r*   rY   r   r   r,   r-   ô   s     zhostnames.<locals>.<genexpr>éü   NrU   Ú.)	r   r   r"   Úfilterr   r   Úsumr<   r   )rN   r\   rX   Úlabelsr   r[   r,   r#   Í   s,    

ÿÿþÿýÿþ"r#   c                  C   s    t dkrdd„ } d | ƒ ¡a t S )zH
        Returns a string containing valid URL path characters.
        Nc               	   s   sR   t tƒD ]D} t| ƒ}|dkrqz| d¡ W n tk
rD   Y qY nX |V  qd S )Nz#/?r(   )r>   r
   r?   r   rV   )r4   Úcr   r   r,   Úchars  s    
zpath_characters.<locals>.charsr5   )Ú_path_charactersr   )re   r   r   r,   Úpath_charactersù   s    rg   c                 C   s$   t tt | ttdtƒ d�dd�ƒƒS )Nr   )rI   rK   é
   )rJ   )r   r   r   r   r   rg   ©rN   r   r   r,   r%     s    ÿþr%   c                 C   sf   t tt | tdd�ƒƒ}t t| tƒ ƒƒ}t tt | tƒ ƒƒ}|dkrHd}tt t| t	dƒƒƒ|||d�S )z£
        A strategy which generates L{EncodedURL}s.
        Call the L{EncodedURL.to_uri} method on each URL to get an HTTP
        protocol-friendly URI.
        T)rP   r   N)ÚhttpÚhttps)ÚschemeÚhostÚportÚpath)
r   r   r3   r&   r   r#   r   r%   r   r   )rN   rn   rm   ro   r   r   r,   r!   #  s    ür!   c                 C   s   t | tƒ ƒƒS )z£
        A strategy which generates L{DecodedURL}s.
        Call the L{EncodedURL.to_uri} method on each URL to get an HTTP
        protocol-friendly URI.
        )r   r!   ri   r   r   r,   r    9  s    r    )r   N)F)T)TT)=Ú__doc__Ú
__future__r   Z
hypothesisÚImportErrorÚtypingr   Ú__all__Úcsvr   r9   Úos.pathr   r   Ústringr   r	   Úsysr
   r   r   r   r   r   r   r   r   Úgzipr   r8   r5   r   r   r   Zhypothesis.strategiesr   r   r   r   r   Úidnar   r   r   rM   r'   ZDrawCallabler?   Ú	NameErrorÚchrrG   r6   r$   r&   r"   r#   rg   rf   r%   r!   r    r   r   r   r,   Ú<module>   sT   (


. -+
	
