U
    ”Ê¹j¹C  ã                   @   s¬  d dl Z d dlmZmZmZ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mZmZmZmZmZmZ ddlmZmZmZ ee
gdf ZedƒZeee ee dœd	d
„ƒZeddœeeee gee f dœdd
„ƒZd5ddœeee  eeee eee gee f f dœdd
„Zeedddddfeee ef ee
ef eeg e
f ef eeee eee e
e
dœ
dd„Z edœdd„Z!e"e
e
ddœdd„Z#e"e
ee
df ddœdd„Z$e"e
ee
df ddœdd „Z%e"e
ee
df ddœd!d"„Z&e"e
ee
df ddœd#d$„Z'e"e
ee
df ddœd%d&„Z(e"e
ee
df ddœd'd(„Z)e"e
e*ddœd)d*„Z+eed+œd,d-„Z,e
ed.œd/d0„Z-ee$ee%e.e&e/e'e0e(e1e)iZ2d
dd1d2d3d4gZ3dS )6é    N)Ú_MISSING_TYPEÚMISSINGÚFieldÚfieldÚfields)Úwraps)ÚAnyÚCallableÚDictÚ
ForwardRefÚListÚLiteralÚOptionalÚTupleÚTypeÚTypeVarÚUnionÚget_argsÚ
get_originÚoverloadé   )Ú#StrictDataclassClassValidationErrorÚStrictDataclassDefinitionErrorÚ#StrictDataclassFieldValidationErrorÚT©ÚclsÚreturnc                 C   s   d S ©N© ©r   r   r   úZ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/huggingface_hub/dataclasses.pyÚstrict!   s    r"   F©Úaccept_kwargs)r$   r   c                 C   s   d S r   r   r#   r   r   r!   r"   %   s    )r   r$   r   c                   s0   t t t t dœ‡ fdd„}| dk	r,|| ƒS |S )a¾  
    Decorator to add strict validation to a dataclass.

    This decorator must be used on top of `@dataclass` to ensure IDEs and static typing tools
    recognize the class as a dataclass.

    Can be used with or without arguments:
    - `@strict`
    - `@strict(accept_kwargs=True)`

    Args:
        cls:
            The class to convert to a strict dataclass.
        accept_kwargs (`bool`, *optional*):
            If True, allows arbitrary keyword arguments in `__init__`. Defaults to False.

    Returns:
        The enhanced dataclass with strict validation on field assignment.

    Example:
    ```py
    >>> from dataclasses import dataclass
    >>> from huggingface_hub.dataclasses import as_validated_field, strict, validated_field

    >>> @as_validated_field
    >>> def positive_int(value: int):
    ...     if not value >= 0:
    ...         raise ValueError(f"Value must be positive, got {value}")

    >>> @strict(accept_kwargs=True)
    ... @dataclass
    ... class User:
    ...     name: str
    ...     age: int = positive_int(default=10)

    # Initialize
    >>> User(name="John")
    User(name='John', age=10)

    # Extra kwargs are accepted
    >>> User(name="John", age=30, lastname="Doe")
    User(name='John', age=30, *lastname='Doe')

    # Invalid type => raises
    >>> User(name="John", age="30")
    huggingface_hub.errors.StrictDataclassFieldValidationError: Validation error for field 'age':
        TypeError: Field 'age' expected int, got str (value: '30')

    # Invalid value => raises
    >>> User(name="John", age=-1)
    huggingface_hub.errors.StrictDataclassFieldValidationError: Validation error for field 'age':
        ValueError: Value must be positive, got -1
    ```
    r   c                    s  t ˆ dƒstdˆ j› d�ƒ‚i }tˆ ƒD ]x}g }| t|ƒ¡ |j d¡}|d k	r–t|t	ƒsb|g}|D ]$}t
|ƒsftd|j› d|› d�ƒ‚qf| |¡ |||j< q(|ˆ _ˆ j‰tttd dœ‡fd	d
„}|ˆ _ˆ�r$ˆ j‰tˆƒtd dœ‡ ‡fdd„ƒ}|ˆ _ˆ j‰tˆƒtdœ‡ ‡fdd„ƒ}|ˆ _g }	tˆ ƒD ]f}
|
 d¡�sD�q0tˆ |
ƒ}t|ƒ�s\�q0tt |¡jƒdk�rŠtdˆ j› d|
› d�ƒ‚|	 |¡ �q0|	ˆ _td dœ‡ fdd„}d|_t ˆ dƒ�rætˆ jddƒ�sætdˆ j› d�ƒ‚|ˆ _ˆ j‰tˆƒd dœ‡ ‡fdd„ƒ}t ˆ d|ƒ ˆ S ) NÚ__dataclass_fields__zClass 'z.' must be a dataclass before applying @strict.Ú	validatorzInvalid validator for field 'ú': z.. Must be a callable taking a single argument.)ÚselfÚnameÚvaluer   c                    sf   | j  |g ¡D ]F}z||ƒ W q ttfk
rR } zt||d�|‚W 5 d}~X Y qX qˆ | ||ƒ dS )z1Custom __setattr__ method for strict dataclasses.)r   ÚcauseN)Ú__validators__ÚgetÚ
ValueErrorÚ	TypeErrorr   )r(   r)   r*   r&   Úe)Úoriginal_setattrr   r!   Ú__strict_setattr__~   s    "z0strict.<locals>.wrap.<locals>.__strict_setattr__)Úkwargsr   c                    s^   dd„ t ˆƒD ƒ‰ ‡ fdd„| ¡ D ƒ}ˆ| f|Ž | ¡ D ]\}}|ˆ kr<|  ||¡ q<d S )Nc                 S   s   h | ]
}|j ’qS r   )r)   )Ú.0Úfr   r   r!   Ú	<setcomp>“   s     z9strict.<locals>.wrap.<locals>.__init__.<locals>.<setcomp>c                    s   i | ]\}}|ˆ kr||“qS r   r   ©r4   ÚkÚv©Zdataclass_fieldsr   r!   Ú
<dictcomp>”   s       z:strict.<locals>.wrap.<locals>.__init__.<locals>.<dictcomp>)r   ÚitemsÚ__setattr__)r(   r3   Zstandard_kwargsr)   r*   )r   Úoriginal_initr:   r!   Ú__init__�   s    z&strict.<locals>.wrap.<locals>.__init__)r   c                    sJ   ˆ| ƒ}‡ fdd„| j  ¡ D ƒ}d |¡}|rF|d d… › d|› d�S |S )Nc                    s*   g | ]"\}}|ˆ j krd |› d|›�‘qS )Ú*ú=)r%   r7   r    r   r!   Ú
<listcomp>©   s   
þz:strict.<locals>.wrap.<locals>.__repr__.<locals>.<listcomp>z, éÿÿÿÿú))Ú__dict__r<   Újoin)r(   Zstandard_reprZadditional_kwargsZadditional_repr)r   Úoriginal_reprr   r!   Ú__repr__£   s    
ý
z&strict.<locals>.wrap.<locals>.__repr__Z	validate_r   z' has a class validator 'z¤' that takes more than one argument. Class validators must take only 'self' as an argument. Methods starting with 'validate_' are considered to be class validators.)r(   r   c                    sT   ˆ j D ]H}z|| ƒ W q ttfk
rL } zt|j|d�|‚W 5 d}~X Y qX qdS )z%Run class validators on the instance.)r&   r+   N)Ú__class_validators__r.   r/   r   Ú__name__)r(   r&   r0   r    r   r!   ÚvalidateÊ   s
    
z&strict.<locals>.wrap.<locals>.validateTrK   Ú"__is_defined_by_strict_decorator__Fzµ' already implements a method called 'validate'. This method name is reserved when using the @strict decorator on a dataclass. If you want to keep your own method, please rename it.c                    s   ˆ| f|ž|Ž ˆ   | ¡ dS )z*Run class validators after initialization.N)rK   )r(   Úargsr3   )r   Úinitial_initr   r!   Úinit_with_validateã   s    z0strict.<locals>.wrap.<locals>.init_with_validater?   )!Úhasattrr   rJ   r   ÚappendÚ_create_type_validatorÚmetadatar-   Ú
isinstanceÚlistÚ_is_validatorr)   Úextendr,   r=   r   Ústrr?   r   rH   ÚdirÚ
startswithÚgetattrÚcallableÚlenÚinspectÚ	signatureÚ
parametersrI   r   rL   rK   Úsetattr)r   Zfield_validatorsr5   Z
validatorsZcustom_validatorr&   r2   r?   rH   Zclass_validatorsr)   ÚmethodrK   rO   r#   )r   rN   r>   rG   r1   r!   Úwrapc   st    
ÿ
ÿ


ÿ
ÿzstrict.<locals>.wrapN)r   r   )r   r$   rc   r   r#   r!   r"   )   s    : T)
r&   ÚdefaultÚdefault_factoryÚinitÚreprÚhashÚcomparerS   r3   r   c           	   
   K   sB   t | tƒs| g} |dkri }| |d< tf |||||||dœ|—ŽS )a<  
    Create a dataclass field with a custom validator.

    Useful to apply several checks to a field. If only applying one rule, check out the [`as_validated_field`] decorator.

    Args:
        validator (`Callable` or `List[Callable]`):
            A method that takes a value as input and raises ValueError/TypeError if the value is invalid.
            Can be a list of validators to apply multiple checks.
        **kwargs:
            Additional arguments to pass to `dataclasses.field()`.

    Returns:
        A field with the validator attached in metadata
    Nr&   ©rd   re   rf   rg   rh   ri   rS   )rT   rU   r   )	r&   rd   re   rf   rg   rh   ri   rS   r3   r   r   r!   Úvalidated_fieldñ   s     
ùørk   ©r&   c              
      sT   t t dddddftttf ttg tf tf tttt ttt tdœ‡ fdd„}|S )a  
    Decorates a validator function as a [`validated_field`] (i.e. a dataclass field with a custom validator).

    Args:
        validator (`Callable`):
            A method that takes a value as input and raises ValueError/TypeError if the value is invalid.
    TN©rd   re   rf   rg   rh   ri   rS   r3   c              
      s    t ˆ f| ||||||dœ|—ŽS )Nrj   )rk   rm   rl   r   r!   Ú_inner%  s    
ÿø	÷z"as_validated_field.<locals>._inner)r   r   r   r   r	   Úboolr   r
   )r&   rn   r   rl   r!   Úas_validated_field  s$    
ù
ørp   )r)   r*   Úexpected_typer   c                 C   s€   t |ƒ}t|ƒ}|tkrdS t |¡ }r8|| ||ƒ nDt|tƒrPt| ||ƒ n,t|tƒsdt|t	ƒrhdS t
d| › d|› �ƒ‚dS )z.Validate that 'value' matches 'expected_type'.NzUnsupported type for field 'r'   )r   r   r   Ú_BASIC_TYPE_VALIDATORSr-   rT   ÚtypeÚ_validate_simple_typer   rX   r/   )r)   r*   rq   ÚoriginrM   r&   r   r   r!   Útype_validator>  s    
rv   .)r)   r*   rM   r   c                 C   s‚   g }|D ]J}zt | ||ƒ W  dS  tk
rP } z| t|ƒ¡ W 5 d}~X Y qX qtd| › dt|ƒ› d|› dd |¡› �ƒ‚dS )z8Validate that value matches one of the types in a Union.NúField 'z' with value z doesn't match any type in z
. Errors: z; )rv   r/   rQ   rX   rg   rF   )r)   r*   rM   ÚerrorsÚtr0   r   r   r!   Ú_validate_unionO  s    "$ÿrz   c                 C   s&   ||kr"t d| › d|› d|› �ƒ‚dS )zValidate Literal type.rw   z' expected one of ú, got N)r/   )r)   r*   rM   r   r   r!   Ú_validate_literal^  s    r|   c                 C   sš   t |tƒs$td| › dt|ƒj› �ƒ‚|d }t|ƒD ]`\}}zt| › d|› d�||ƒ W q4 tk
r’ } ztd|› d| › d�ƒ|‚W 5 d	}~X Y q4X q4d	S )
zValidate List[T] type.rw   z' expected a list, got r   ú[ú]úInvalid item at index z
 in list 'ú'N)rT   rU   r/   rs   rJ   Ú	enumeraterv   ©r)   r*   rM   Z	item_typeÚiÚitemr0   r   r   r!   Ú_validate_listd  s    
r…   c                 C   s¦   t |tƒs$td| › dt|ƒj› �ƒ‚|\}}| ¡ D ]l\}}z.t| › d�||ƒ t| › d|›d�||ƒ W q4 tk
rž } ztd| › d�ƒ|‚W 5 d}~X Y q4X q4dS )	zValidate Dict[K, V] type.rw   z' expected a dict, got z.keyr}   r~   zInvalid key or value in dict 'r€   N)rT   Údictr/   rs   rJ   r<   rv   )r)   r*   rM   Zkey_typeZ
value_typer8   r9   r0   r   r   r!   Ú_validate_dictr  s    
r‡   c                 C   sZ  t |tƒs$td| › dt|ƒj› �ƒ‚t|ƒdkr¬|d tkr¬t|ƒD ]d\}}z t| › d|› d�||d ƒ W qD tk
r¦ } ztd|› d	| › d
�ƒ|‚W 5 d}~X Y qDX qDnªt|ƒt|ƒkràtd| › dt|ƒ› dt|ƒ› �ƒ‚nvtt	||ƒƒD ]f\}\}}zt| › d|› d�||ƒ W qî tk
�rR } ztd|› d	| › d
�ƒ|‚W 5 d}~X Y qîX qîdS )zValidate Tuple type.rw   z' expected a tuple, got é   r   r}   r~   r   r   z in tuple 'r€   Nz' expected a tuple of length r{   )
rT   Útupler/   rs   rJ   r]   ÚEllipsisr�   rv   Úzip)r)   r*   rM   rƒ   r„   r0   Úexpectedr   r   r!   Ú_validate_tuple�  s    
 .$r�   c                 C   sŽ   t |tƒs$td| › dt|ƒj› �ƒ‚|d }t|ƒD ]T\}}zt| › d�||ƒ W q4 tk
r† } ztd| › d�ƒ|‚W 5 d}~X Y q4X q4dS )zValidate Set[T] type.rw   z' expected a set, got r   z itemzInvalid item in set 'r€   N)rT   Úsetr/   rs   rJ   r�   rv   r‚   r   r   r!   Ú_validate_set˜  s    
r�   c              
   C   s<   t ||ƒs8td| › d|j› dt|ƒj› dt|ƒ› d�	ƒ‚dS )z&Validate simple type (int, str, etc.).rw   z' expected r{   z	 (value: rD   N)rT   r/   rJ   rs   rg   )r)   r*   rq   r   r   r!   rt   ¦  s    
(ÿrt   )r   r   c                    s   t ddœ‡ fdd„}|S )z-Create a type validator function for a field.N)r*   r   c                    s   t ˆ j| ˆ jƒ d S r   )rv   r)   rs   )r*   ©r   r   r!   r&   ²  s    z)_create_type_validator.<locals>.validator)r   )r   r&   r   r�   r!   rR   ®  s    rR   )r&   r   c                 C   s‚   t | ƒsdS t | ¡}t|j ¡ ƒ}t|ƒdkr4dS |d jtjj	tjj
tjjfkrXdS |dd… D ]}|jtjjkrd dS qddS )züCheck if a function is a validator.

    A validator is a Callable that can be called with a single positional argument.
    The validator can have more arguments with default values.

    Basically, returns True if `validator(value)` is possible.
    Fr   r   NT)r\   r^   r_   rU   r`   Úvaluesr]   ÚkindÚ	ParameterÚPOSITIONAL_OR_KEYWORDÚPOSITIONAL_ONLYÚVAR_POSITIONALrd   Úempty)r&   r_   r`   Z	parameterr   r   r!   rV   ¸  s     
ýrV   ÚValidator_Tr   r   r   )N)4r^   Údataclassesr   r   r   r   r   Ú	functoolsr   Útypingr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   r˜   r   r"   ro   rk   rp   rX   rv   rz   r|   r…   r‡   r�   r�   rs   rt   rR   rV   rU   r†   r‰   rŽ   rr   Ú__all__r   r   r   r!   Ú<module>   sŠ   @* ÿÿ
  þ Kø
ö+"
      úú