U
    kufv9                     @  s  U d dl mZ d dlmZ d dlmZmZ d dlmZ d dlZd dl	Z	d dl
Z
d dlZd dlmZ e
jegef Ze
jdedZe
je
je e
je
je d	f f Ze	d
e	jZG dd dZe Ze Ze Ze Z e Z!e Z"e#eeee e!e"dZ$de%d< dhddddZ&e&dde&dddddddZ'e&ddddddej(ddddd d!Z)e&d"ej(d#dddd$d%Z*ee+6 d d&l,m-Z- e&d'd(d(d(d(d(ddddd)d*Z.W 5 Q R X ee+4 d dl/Z/e&d+d+d+e/j0e1fd,dddd-d.Z2W 5 Q R X zd dl3Z3W nr e+k
r~   ee+N d d/l4m5Z5 e&d0ddddd1d2Z6e&d3d3d3d3e7d4dddd5d6Z8W 5 Q R X Y nX e&d7d7d7e7d,dddd8d9Z9e&d:d:d:e7d,dddd;d<Z:e&d0e7d#dddd=d2Z6e&d3d3d3d3e7d4dddd>d6Z8ee+J d d?l;m<Z< e&d@dddddAdBZ=e&dCdCdCdDddddEdFZ>W 5 Q R X e&dGe	j?d#ddddHdIZ@e&dJdJdJdJe7dKddddLdMZAe&dCe7dNddddOdPZBee+J d dQlCmDZD d dlCZCddddRdSZEe&dTe7eFfdNddddUdVZGW 5 Q R X ee+T d dlHZHe&dWdWdWdWeHjId4ddddXdYZJe&dZdZdZeHjId,dddd[d\ZKW 5 Q R X ee+. d dlLZLe&d]d]d]d]d^dddd_d`ZMW 5 Q R X ee+. d dlNZNe&dadaeNjOdbddddcddZPW 5 Q R X e&dedee7dbddddfdgZQdS )i    )annotations)suppress)datedatetime)UUIDN)FormatError_F)bound.z^\d{4}-\d{2}-\d{2}$c                   @  s   e Zd ZU dZi Zded< dddddZd	d
 ZdddddddZe	d ddddddZ
e	d!ddddddZddddddZddddddZdS )"FormatCheckeray  
    A ``format`` property checker.

    JSON Schema does not mandate that the ``format`` property actually do any
    validation. If validation is desired however, instances of this class can
    be hooked into validators to enable format validation.

    `FormatChecker` objects always return ``True`` when asked about
    formats that they do not know how to validate.

    To add a check for a custom format use the `FormatChecker.checks`
    decorator.

    Arguments:

        formats:

            The known formats to validate. This argument can be used to
            limit which formats will be used during validation.
    z3dict[str, tuple[_FormatCheckCallable, _RaisesType]]checkersNztyping.Iterable[str] | None)formatsc                   s*   |d kr j  } fdd|D  _ d S )Nc                   s   i | ]}| j | qS  r   ).0kselfr   6/tmp/pip-unpacked-wheel-k94ccfep/jsonschema/_format.py
<dictcomp>5   s      z*FormatChecker.__init__.<locals>.<dictcomp>)r   keys)r   r   r   r   r   __init__2   s    
zFormatChecker.__init__c                 C  s   dt | j dS )Nz<FormatChecker checkers=>)sortedr   r   r   r   r   __repr__7   s    zFormatChecker.__repr__r   str_RaisesTypetyping.Callable[[_F], _F])formatraisesreturnc                   s   ddd fdd}|S )a  
        Register a decorated function as validating a new format.

        Arguments:

            format:

                The format that the decorated function will check.

            raises:

                The exception(s) raised by the decorated function when an
                invalid instance is found.

                The exception object will be accessible as the
                `jsonschema.exceptions.ValidationError.cause` attribute of the
                resulting validation error.
        r   funcr   c                   s   | fj  < | S Nr   r!   r   r   r   r   r   _checksP   s    z%FormatChecker.checks.<locals>._checksr   )r   r   r   r%   r   r$   r   checks:   s    zFormatChecker.checksc                 C  s   t jdtdd | j||dS )NzoFormatChecker.cls_checks is deprecated. Call FormatChecker.checks on a specific FormatChecker instance instead.   )
stacklevel)r   r   )warningswarnDeprecationWarning_cls_checksclsr   r   r   r   r   
cls_checksV   s    	zFormatChecker.cls_checksc                   s   ddd fdd}|S )Nr   r    c                   s   | f j < | S r"   r   r#   r-   r   r   r%   i   s    z*FormatChecker._cls_checks.<locals>._checksr   )r.   r   r   r%   r   r-   r   r,   e   s    zFormatChecker._cls_checksobjectNone)instancer   r   c              
   C  sv   || j krdS | j | \}}d\}}z||}W n& |k
rV } z|}W 5 d}~X Y nX |srt|d||ddS )a  
        Check whether the instance conforms to the given format.

        Arguments:

            instance (*any primitive type*, i.e. str, number, bool):

                The instance to check

            format:

                The format that instance should conform to

        Raises:

            FormatError:

                if the instance does not conform to ``format``
        N)NNz
 is not a )cause)r   r   )r   r2   r   r!   r   resultr3   er   r   r   checko   s    
zFormatChecker.checkboolc                 C  s0   z|  || W n tk
r&   Y dS X dS dS )aV  
        Check whether the instance conforms to the given format.

        Arguments:

            instance (*any primitive type*, i.e. str, number, bool):

                The instance to check

            format:

                The format that instance should conform to

        Returns:

            bool: whether it conformed
        FTN)r6   r   )r   r2   r   r   r   r   conforms   s
    zFormatChecker.conforms)N)r   )r   )r   )__name__
__module____qualname____doc__r   __annotations__r   r   r&   classmethodr/   r,   r6   r8   r   r   r   r   r
      s   

   	 r
   )draft3draft4draft6draft7draft201909draft202012zdict[str, FormatChecker]_draft_checkersr   r   )r   c           	        sT   p| p| p| p|  p&|  p.| ddd fdd}|S )Nr   r    c                   s   rt d | } r0t d | } rHt d | } r`t d | }  rxt d  | } rt d | } tp pppp|  | S )Nr?   r@   rA   rB   rC   rD   )rE   r&   r
   r,   r#   rC   rD   r?   r@   rA   rB   r   r   r   wrap   s.    z_checks_drafts.<locals>.wrapr   )	namer?   r@   rA   rB   rC   rD   r   rG   r   rF   r   _checks_drafts   s    
 rI   z	idn-email)rH   emailr0   r7   )r2   r   c                 C  s   t | tsdS d| kS )NT@)
isinstancer   r2   r   r   r   is_email   s    
rN   z
ip-addressZipv4)r?   r@   rA   rB   rC   rD   r   c                 C  s   t | tsdS tt| S NT)rL   r   r7   	ipaddressIPv4AddressrM   r   r   r   is_ipv4   s    

rR   Zipv6)rH   r   c                 C  s&   t | tsdS t| }t|dd S )NTZscope_id )rL   r   rP   IPv6Addressgetattr)r2   addressr   r   r   is_ipv6   s    

rW   )FQDNz	host-namehostnamec                 C  s   t | tsdS t| ddjS )NT   )Z
min_labels)rL   r   rX   Zis_validrM   r   r   r   is_host_name
  s    	
r[   zidn-hostname)rB   rC   rD   r   c                 C  s   t | tsdS t|  dS rO   )rL   r   idnaencoderM   r   r   r   is_idn_host_name  s    

r^   )validate_rfc3986uric                 C  s   t | tsdS t| ddS NTURIZrulerL   r   r_   rM   r   r   r   is_uri/  s    
re   zuri-reference)rA   rB   rC   rD   r   c                 C  s   t | tsdS t| ddS NTZURI_referencerc   rd   rM   r   r   r   is_uri_reference5  s    
rg   Ziric                 C  s   t | tsdS tj| ddS )NTZIRIrc   rL   r   rfc3987parserM   r   r   r   is_iriC  s    
rk   ziri-referencec                 C  s   t | tsdS tj| ddS )NTZIRI_referencerc   rh   rM   r   r   r   is_iri_referenceN  s    
rl   c                 C  s   t | tsdS tj| ddS ra   rh   rM   r   r   r   re   Y  s    
c                 C  s   t | tsdS tj| ddS rf   rh   rM   r   r   r   rg   _  s    
)validate_rfc3339z	date-timec                 C  s   t | tsdS t|  S rO   )rL   r   rm   upperrM   r   r   r   is_datetimeo  s    
ro   time)rB   rC   rD   c                 C  s   t | tsdS td|  S )NTz1970-01-01T)rL   r   ro   rM   r   r   r   is_timeu  s    
rq   regexc                 C  s   t | tsdS tt| S rO   )rL   r   r7   recompilerM   r   r   r   is_regex  s    
ru   r   )r?   rB   rC   rD   r   c                 C  s&   t | tsdS tt| o"t| S rO   )rL   r   r7   _RE_DATE	fullmatchr   fromisoformatrM   r   r   r   is_date  s    
ry   )r?   r   c                 C  s   t | tsdS tt| dS )NTz%H:%M:%S)rL   r   r7   r   strptimerM   r   r   r   is_draft3_time  s    
r{   )CSS21_NAMES_TO_HEXc                 C  s
   t | S r"   )	webcolorsZnormalize_hexrM   r   r   r   is_css_color_code  s    r~   colorc                 C  s"   t | tr|  tkrdS t| S rO   )rL   r   lowerr|   r~   rM   r   r   r   is_css21_color  s    
r   zjson-pointerc                 C  s   t | tsdS tt| S rO   )rL   r   r7   jsonpointerJsonPointerrM   r   r   r   is_json_pointer  s    
r   zrelative-json-pointerc                 C  s   t | tsdS | sdS g d }}t| D ]X\}}| rf|dkrZt| |d  dkrZ dS || q(|sp dS | |d  } qq(|dkptt|S )NTFrS   r   rZ   #)	rL   r   	enumerateisdigitintappendr7   r   r   )r2   Znon_negative_integerresti	characterr   r   r   is_relative_json_pointer  s     	


r   zuri-template)rA   rB   rC   rD   c                 C  s   t | tsdS t| S rO   )rL   r   uri_templatevalidaterM   r   r   r   is_uri_template  s    
r   duration)rC   rD   r   c                 C  s&   t | tsdS t|  | tdS )NTZDMYWHMS)rL   r   isodurationZparse_durationendswithtuplerM   r   r   r   is_duration  s    

r   uuidc                   s,   t  tsdS t  t fdddD S )NTc                 3  s   | ]} | d kV  qdS )-Nr   )r   positionrM   r   r   	<genexpr>  s     zis_uuid.<locals>.<genexpr>)            )rL   r   r   allrM   r   rM   r   is_uuid  s    
r   )NNNNNNNr   )R
__future__r   
contextlibr   r   r   r   r   rP   rs   typingr)   Zjsonschema.exceptionsr   Callabler0   r7   Z_FormatCheckCallableTypeVarr   UnionType	ExceptionTupler   rt   ASCIIrv   r
   Zdraft3_format_checkerZdraft4_format_checkerZdraft6_format_checkerZdraft7_format_checkerZdraft201909_format_checkerZdraft202012_format_checkerdictrE   r=   rI   rN   AddressValueErrorrR   rW   ImportErrorZfqdnrX   r[   r\   	IDNAErrorUnicodeErrorr^   ri   Zrfc3986_validatorr_   re   
ValueErrorrg   rk   rl   Zrfc3339_validatorrm   ro   rq   errorru   ry   r{   r}   r|   r~   	TypeErrorr   r   ZJsonPointerExceptionr   r   r   r   r   ZDurationParsingExceptionr   r   r   r   r   r   <module>   sl            .	


"



	
	

