
    ie                        U d dl Zd dlZd dlZd dl mZ d dlmZmZmZm	Z	m
Z
mZ d dlmZ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 	 d dlmZmZ d
dlm Z m!Z!m"Z" eegdf   Z# ed      Z$ ede%e&ef         Z' e(       Z)edee$   dee$   fd       Z*eddde+deee$   gee$   f   fd       Z*d>dddee$   dz  de+dee$   eee$   gee$   f   z  fdZ*dee'   de%ddfdZ,edee'   defd       Z-dee'   de%e&ef   fdZ.eedddddfde/e#   e#z  deez  deg ef   ez  d e+d!e+d"e+dz  d#e+d$e%dz  d%edefd&Z0de#fd'Z1d(e&d)ed*eddfd+Z2d(e&d)eddfd,Z3d(e&d)ed-e4ed.f   ddfd/Z5d(e&d)ed-e4ed.f   ddfd0Z6d(e&d)ed-e4ed.f   ddfd1Z7d(e&d)ed-e4ed.f   ddfd2Z8d(e&d)ed-e4ed.f   ddfd3Z9d(e&d)ed-e4ed.f   ddfd4Z:d(e&d)ed-e4ed.f   ddfd5Z;d(e&d)ed*eddfd6Z<d7ede#fd8Z=dede+fd9Z>d:ede+fd;Z?ee5ee6e/e7e%e8e4e9e@e:ej                  j                  e;iZCe%eee&ee4ed.f   gdf   f   eDd<<   e5eCej                  <   g d=ZFy# e$ r- 	 d dlmZmZ n# e$ r  eddi       Z ed	di       ZY nw xY wY  w xY w)?    N)Callable)_MISSING_TYPEMISSINGFieldfieldfieldsmake_dataclass)	lru_cachewraps)
	AnnotatedAny
ForwardRefLiteralTypeTypeVarUnionget_args
get_originoverload)NotRequiredRequiredr    r      )#StrictDataclassClassValidationErrorStrictDataclassDefinitionError#StrictDataclassFieldValidationErrorTTypedDictType)boundclsreturnc                      y Nr   )r    s    l/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/huggingface_hub/dataclasses.pystrictr%   0   s    %(    Faccept_kwargsr(   c                      y r#   r   r'   s    r$   r%   r%   4   s    LOr&   c                \    dt         t           dt         t           ffd}|  ||       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    r!   c           	          t         d      st        d j                   d      i }t               D ]  }g }|j	                  t        |             |j                  j                  d      }|Rt        |t              s|g}|D ])  }t        |      rt        d|j                   d| d       |j                  |       |||j                  <    | _         j                  dt        d	t         d
t        dd ffd}| _        r j"                  }t%        |      dt        dd f fd       }| _        t         d      sdt        dd fd}	|	 _         j(                  t%              dt         f fd       }
 j*                  j,                  du r|
 _        g }t/               D ]  }|j1                  d      st3         |      }t5        |      s-t7        t9        j:                  |      j<                        dk7  rt        d j                   d| d      |j	                  |        | _        dt@        dd f fd}d|_!        t         d      r0t3         jD                  dd      st        d j                   d      | _"         j"                  t%              d fd       }tG         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                     | j                   j                  |g       D ]  }	  ||         | ||       y# t        t        f$ r}t	        ||      |d}~ww xY w)z1Custom __setattr__ method for strict dataclasses.)r   causeN)__validators__get
ValueError	TypeErrorr   )r/   r0   r1   r-   eoriginal_setattrs        r$   __strict_setattr__z0strict.<locals>.wrap.<locals>.__strict_setattr__   so     "0044T2> Z	Ze$Z T4/	 #I. Z=DPQRXYYZs   7AAAkwargsc                    t              D ch c]  }|j                   }}|j                         D ci c]  \  }}||v s|| }}}t        |      dkD  r%t	        dj
                   dt        |       d      t              D ]  }|j                  |v r%t        | |j                  ||j                            6|j                  t        ur"t        | |j                  |j                         j|j                  t        ur&t        | |j                  |j                                t        d|j                   d       i }|j                         D ]  \  }	}
|	|vs|
||	<     | j                  di | y c c}w c c}}w )Nr   zWhen `accept_kwargs=True`, z, accepts only keyword arguments, but found `z` positional args.zMissing required field - ''r   )r   r0   itemslenr6   __name__setattrdefaultr   default_factoryr7   __post_init__)r/   argsr;   fdataclass_fieldskvstandard_kwargsadditional_kwargsr0   r1   r    s              r$   __init__z&strict.<locals>.wrap.<locals>.__init__   sw    5;3K#@qAFF#@ #@4:LLN"\DAqaK[F[1a4"\"\ t9q=$5cll^ D&&)$i[0BD 
   PAvv0affoaff.EF'1affaii8**'9affa.?.?.AB'*DQVVHA(NOOP %'!#)<<> 8KD%#3327)$/8 #""7%67= $A"\s   E=FFrD   c                 N    |j                         D ]  \  }}t        | ||        y)z2Default __post_init__ to accept additional kwargs.N)r>   rA   )r/   r;   r0   r1   s       r$   rD   z+strict.<locals>.wrap.<locals>.__post_init__   s'    '-||~ 3edE23r&   c                      |       }| j                   j                         D cg c]  \  }}|j                  vrd| d| }}}dj                  |      }|r|d d  d| dS |S c c}}w )N*=z, ))__dict__r>   r,   join)r/   standard_reprrH   rI   rK   additional_reprr    original_reprs         r$   __repr__z&strict.<locals>.wrap.<locals>.__repr__   s     !.d 3 !% 3 3 5% 1 8 88 s!A5M%! % #')),="> GX-,-R/@Bj]jj%s    A*T	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.c                     j                   D ]  }	  ||         y# t        t        f$ r}t        |j                  |      |d}~ww xY w)z%Run class validators on the instance.)r-   r3   N)__class_validators__r6   r7   r   r@   )r/   r-   r8   r    s      r$   validatez&strict.<locals>.wrap.<locals>.validate   sW     55 l	ldOl #I. l=	HZHZbcdjkkls   A	AA	r\   "__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                 @     | g|i | j                  |        y)z*Run class validators after initialization.N)r\   )r/   rE   r;   r    initial_inits      r$   init_with_validatez0strict.<locals>.wrap.<locals>.init_with_validate  s#     ///LLr&   rL   )r!   N)$hasattrr   r@   r   append_create_type_validatormetadatar5   
isinstancelist_is_validatorr0   extendr4   __setattr__r   strrL   r   rD   rX   __dataclass_params__reprdir
startswithgetattrcallabler?   inspect	signature
parametersr[   r   r]   r\   rA   )r    field_validatorsrF   
validatorscustom_validatorr-   r:   original_initrL   rD   rX   class_validatorsr0   methodr\   r`   r_   rW   r9   r(   s   `               @@@r$   wrapzstrict.<locals>.wrapp   s   s230#,,'UV 
 :< 	2AJ4Q78 zz~~k:+!"2D9(8'9$!1 I(3<;AFF83ykQ  A 
 !!"23'1QVV$	2 . ??
	0S 
	0 
	0C 
	0D 
	0 -LLM=! 8  8  8 " 8D $CL 303# 3$ 3
 %2!  LLM=!k# k "k  '',,4' H 	,D??;/S$'FF#7$$V,778A=4cll^+DTF K> > 
 ##F+	, $4 	l1 	l 	l 7;33
#3<<)MuU4cll^ ,N N    ||	|		 
	
 	Z!34
r&   )r   r   )r    r(   rz   s    ` r$   r%   r%   8   s8    ph$q' hd1g hV 491T1r&   schemadatac                 *    t        |       } |di | y)a  
    Validate that a dictionary conforms to the types defined in a TypedDict class.

    Under the hood, the typed dict is converted to a strict dataclass and validated using the `@strict` decorator.

    Args:
        schema (`type[TypedDictType]`):
            The TypedDict class defining the expected structure and types.
        data (`dict`):
            The dictionary to validate.

    Raises:
        `StrictDataclassFieldValidationError`:
            If any field in the dictionary does not conform to the expected type.

    Example:
    ```py
    >>> from typing import Annotated, TypedDict
    >>> from huggingface_hub.dataclasses import validate_typed_dict

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

    >>> class User(TypedDict):
    ...     name: str
    ...     age: Annotated[int, positive_int]

    >>> # Valid data
    >>> validate_typed_dict(User, {"name": "John", "age": 30})

    >>> # Invalid type for age
    >>> validate_typed_dict(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 for age
    >>> validate_typed_dict(User, {"name": "John", "age": -1})
    huggingface_hub.errors.StrictDataclassFieldValidationError: Validation error for field 'age':
        ValueError: Value must be positive, got -1
    ```
    Nr   )!_build_strict_cls_from_typed_dict)r{   r|   
strict_clss      r$   validate_typed_dictr     s    X 36:J r&   c                    t        |       }t        | dd      s|j                         D ]t  \  }}t        |      }|t        u rDt        |      ^}}t        |      s	t        |   }t        t        |gt        |      z            ||<   ]t        |      rit        |   ||<   v g }|j                         D ]p  \  }}t        |      t        u r7t        |      ^}} |j                  ||t        t        d|d   i      f       N |j                  ||t        t              f       r t        t        | j                  |            S )N	__total__Tr-   r   )rB   rd   )rB   )_get_typed_dict_annotationsro   r>   r   r   r   _is_required_or_notrequiredr   tuplerf   rb   r   _TYPED_DICT_DEFAULT_VALUEr%   r	   r@   )r{   
type_hintskeyr1   originbasemetar   s           r$   r~   r~   P  s9    -V4J 6;-$**, 		5JC&F"&uot248&t,D"+E4&4:2E,F"G
307"-e"4
3		5 F &&( R
Ue	)"5/KD4FMM3e4MYdfjklfmXn&opqFMM3u5N'OPQR .&9::r&   c           	          	 ddl }|j                  |       S # t        $ rU | j                  j	                  di       j                         D ci c]  \  }}|||n
t        d       nc c}}w c}}cY S w xY w)z0Extract type annotations from a TypedDict class.r   N__annotations__)annotationlibget_annotationsImportErrorrS   r5   r>   type)r{   r   r0   r1   s       r$   r   r   o  s}    
,,V44 

  &223DbIOOQ	
 e 5,%$t*<
 
 	

s    6A5A('A54A5Tr-   rB   rC   initrl   hashcomparerd   r;   c                 `    t        | t              s| g} |i }| |d<   t        d|||||||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
    r-   rB   rC   r   rl   r   r   rd   r   )re   rf   r   )	r-   rB   rC   r   rl   r   r   rd   r;   s	            r$   validated_fieldr     s[    4 i&K	%H[ 	'	 	 	r&   c                      t         t         dddddfdt        t        z  dt        g t        f   t        z  dt        dt        dt        dz  dt        d	t
        dz  d
t        f f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.
    TNrB   rC   r   rl   r   r   rd   r;   c                 ,    t        f| ||||||d|S )Nr   )r   )	rB   rC   r   rl   r   r   rd   r;   r-   s	           r$   _innerz"as_validated_field.<locals>._inner  s9     

+

 

 
	
r&   )r   r   r   r   booldict)r-   r   s   ` r$   as_validated_fieldr     s     (/=D  $
}$
!"c'*]:
 
 	

 Tk
 
 +
 
, Mr&   r0   r1   expected_typec                    t        |      }t        |      }|t        u ry|t        | |       yt        j                  |      x}r || ||       yt        |t              rt        | ||       yt        |t              st        |t              ry|t        u r(|t        u rt        d|  d      t        | ||d          y|t        u r|t        u ryt        | ||d          yt        d|  d|       )z.Validate that 'value' matches 'expected_type'.NField 'z' is required but missing.r   zUnsupported type for field 'r.   )r   r   r   _validate_none_BASIC_TYPE_VALIDATORSr5   re   r   _validate_simple_typer   rj   r   r   r7   type_validatorr   )r0   r1   r   r   rE   r-   s         r$   r   r     s    &FM"D		tU#,008	8	8$t$	M4	(dE=9	M:	.*]C2P	8	--gdV+EFGGtUDG,	;	--tUDG,6tfCOPPr&   c                 P    |$t        d|  dt        |      j                         y)zValidate None type.

    'None' is not a type, it's a special value. Type should be `NoneType` instead.
    But in type annotations 'None' is accepted so we must support it.
    Nr   z' expected None, got )r7   r   r@   )r0   r1   s     r$   r   r     s3     '$'<T%[=Q=Q<RSTT r&   rE   .c                     g }|D ]  }	 t        | ||        y t        d|  dt	        |       d| ddj                  |             # t        $ r$}|j                  t        |             Y d}~kd}~ww xY w)z8Validate that value matches one of the types in a Union.Nr   z' with value z doesn't match any type in z
. Errors: z; )r   r7   rb   rj   rl   rT   )r0   r1   rE   errorstr8   s         r$   _validate_unionr     s    F "	"4*" 
$}T%[M1LTFR\]a]f]fgm]n\op   	"MM#a&!!	"s   A	A5A00A5c                    t        |t              r8||D cg c]  }t        |t              s| c}vrt        d|  d| d|       yt        |t              rI||D cg c]&  }t        |t              st        |t              r%|( c}vrt        d|  d| d|       y||vrt        d|  d| d|       yc c}w c c}w )zValidate Literal type.r   z' expected one of , got N)re   r   r7   int)r0   r1   rE   args       r$   _validate_literalr      s    %F
30EFFgdV+=dV6%QRR G	E3	c
30DZX[]aMbccgdV+=dV6%QRR d	d	'$'9$veWMNN 
 G ds   B;B;C 4C C c           	         t        |t              s$t        d|  dt        |      j                         |d   }t        |      D ]  \  }}	 t        |  d| d||        y	# t        $ r}t        d| d|  d      |d	}~ww xY w)
zValidate list[T] type.r   z' expected a list, got r   []Invalid item at index z
 in list 'r=   N)re   rf   r7   r   r@   	enumerater   r0   r1   rE   	item_typeiitemr8   s          r$   _validate_listr     s    eT"'$'>tE{?S?S>TUVV QIU# R4	RdV1QCq>4;R  	R4QCz$qIJPQQ	Rs   A""	B+A>>Bc                 0   t        |t              s$t        d|  dt        |      j                         |\  }}|j                         D ])  \  }}	 t        |  d||       t        |  d|d||       + y# t        $ r}t        d|  d      |d}~ww xY w)	zValidate dict[K, V] type.r   z' expected a dict, got z.keyr   r   zInvalid key or value in dict 'r=   N)re   r   r7   r   r@   r>   r   )r0   r1   rE   key_type
value_typerH   rI   r8   s           r$   _validate_dictr     s    eT"'$'>tE{?S?S>TUVV  Hj M1	MdV4=!X6dV1QE+Q
;M  	M<TF!DE1L	Ms   #A77	B BBc           
      f   t        |t              s$t        d|  dt        |      j                         t        |      dk(  r6|d   t        u r+t        |      D ]  \  }}	 t        |  d| d||d           yt        |      t        |      k7  r&t        d|  dt        |       dt        |             t        t        ||            D ]  \  }\  }}	 t        |  d| d||        y# t        $ r}t        d| d	|  d
      |d}~ww xY w# t        $ r}t        d| d	|  d
      |d}~ww xY w)zValidate Tuple type.r   z' expected a tuple, got    r   r   r   r   r   z in tuple 'r=   Nz' expected a tuple of length r   )
re   r   r7   r   r@   r?   Ellipsisr   r   zip)r0   r1   rE   r   r   r8   expecteds          r$   _validate_tupler   )  si   eU#'$'?U@T@T?UVWW 4yA~$q'X- ' 	WGAtW$q1~tT!W=	W 
Tc%j	 '$'DSYKvVYZ_V`Uabcc#,S-=#> 	WAhW$q1~tX>	W  W"8;tfA NOUVVW  W"8;tfA NOUVVWs0    C+D+	D4DD	D0D++D0c                     t        |t              s$t        d|  dt        |      j                         |d   }t        |      D ]  \  }}	 t        |  d||        y# t        $ r}t        d|  d      |d}~ww xY w)zValidate set[T] type.r   z' expected a set, got r   z itemzInvalid item in set 'r=   N)re   setr7   r   r@   r   r   r   s          r$   _validate_setr   @  s    eS!'$'=d5k>R>R=STUU QIU# D4	DdV5>4;D  	D3D6;<!C	Ds   A	A=(A88A=c           	      :   t        |t        j                  j                        s$t	        d|  dt        |      j                         |sy|d   }t        |      D ]  \  }}	 t        |  d| d||        y# t        $ r}t	        d| d|  d	      |d}~ww xY w)
z&Validate Sequence or Sequence[T] type.r   z' expected a Sequence, got Nr   r   r   r   z in sequence 'r=   )	re   collectionsabcSequencer7   r   r@   r   r   r   s          r$   _validate_sequencer   N  s    e[__556'$'B4;CWCWBXYZZ  QIU# V4	VdV1QCq>4;V  	V4QC~dV1MNTUU	Vs   #A99	BBBc                 D   |t         u rNt        |t              r>t        d|  d|j                   dt        |      j                   dt        |       d	      t        ||      s>t        d|  d|j                   dt        |      j                   dt        |       d	      y)z&Validate simple type (int, str, etc.).r   z' expected r   z	 (value: rR   N)r   re   r   r7   r@   r   rl   )r0   r1   r   s      r$   r   r   `  s    
5$ 7dV;}'='=&>fT%[EYEYDZZcdhindocppqr
 	
 e]+dV;}'='=&>fT%[EYEYDZZcdhindocppqr
 	
 ,r&   r   c                 $     dt         ddf fd}|S )z-Create a type validator function for a field.r1   r!   Nc                 H    t        j                  | j                         y r#   )r   r0   r   )r1   r   s    r$   r-   z)_create_type_validator.<locals>.validatorp  s    uzz5%**5r&   )r   )r   r-   s   ` r$   rc   rc   l  s    6 6 6 r&   c                    t        |       syt        j                  |       }t        |j                  j                               }t        |      dk(  ry|d   j                  t        j                  j                  t        j                  j                  t        j                  j                  fvry|dd D ]+  }|j                  t        j                  j                  k(  s+ y y)zCheck 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)rp   rq   rr   rf   rs   valuesr?   kind	ParameterPOSITIONAL_OR_KEYWORDPOSITIONAL_ONLYVAR_POSITIONALrB   empty)r-   rr   rs   	parameters       r$   rg   rg   v  s     I!!),Ii**1134J
:!!}//))((" 
 ^ 	 1 1 7 77 r&   	type_hintc                 P    | t         t        fv xs t        |       t         t        fv S )z2Helper to check if a type is Required/NotRequired.)r   r   r   )r   s    r$   r   r     s'    ;//eJy4IhXcMd4der&   r   )r%   r   r   Validator_Tr   r   r   r#   )Gcollections.abcr   rq   typesr   dataclassesr   r   r   r   r   r	   	functoolsr
   r   typingr   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r   r   r   r   r   r   r   rj   r   objectr   r%   r   r   r~   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   rg   r   r   r   r   r   r   	UnionType__all__r   r&   r$   <module>r      s      $ T T &  
2,  ud{#CLtCH~>"H  
 (Q (DG ( 
 ( 
$) OT OhQy$q'7I.J O 
 Oc2 c2Q$ c2 c2$q'T\^bcd^e]fhlmnho]oTpJp c2L/] 3 /4 /D /d ;d=.A ;d ; ;<
](; 
S#X 
$ $+9@ (K ;.(= ( b#g&6( 	(
 ( +( ( Tk( ( 	(V+ DQ QS Q Q Q6U US UT U# c sCx T 	OC 	O 	O5c? 	Ot 	OR RS Rc3h RD RM MS Mc3h MD MW# Wc WsCx WT W.D DC DuS#X D4 DVS V VE#s(O V V$	
 	
C 	
 	
 	
% K S T 6f3 f4 f 
?..	?OO0R S(CeCHo+F+L"MMN  +: u 'Y  22;; 2
B+="b12	2s6   H< <I.I
I.I'$I.&I''I.-I.