o
    5tiU                     @   s4  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ ee	Z
deeeef B dB deeeef B dB fddZ	dd	ed
ededededeedB  fddZdedB deeef fddZde jddfddZdedeeB eB eB fddZdedeeef fddZG dd de jZG dd de jZdS )     N)Sequence)Anyvaluereturnc                 C   sZ   | du rdS t | tr| S zt| W S  tjy,   d| v r(td|  dd|  Y S w )zGTry to parse a string as JSON. If it fails, return the original string.N{zInvalid JSON: z+. Hint: Use double quotes for JSON strings.)
isinstancedictjsonloadsJSONDecodeError
ValueError)r    r   F/home/ubuntu/.local/lib/python3.10/site-packages/lm_eval/_cli/utils.pytry_parse_json   s   

r   ,min_lenmax_lendefaults
split_charc                    s   dd   fdd| |D }t|}|dkr|| }|S || k s&||kr1td| d| d||krVtd| d| d	  fd
d| |D }|||d  |S )zParses a string of integers or 'None' values separated by a specified character into a list.

    Validates the number of items against specified minimum and maximum lengths and fills missing values with defaults.
    c                 S   sB   |    } | dkrdS zt| W S  ty    t|  ddw )zAParses an individual item, converting it to an integer or `None`.noneNz is not an integer or None)striplowerintr   )itemr   r   r   parse_value$   s   
z/_int_or_none_list_arg_type.<locals>.parse_valuec                       g | ]} |qS r   r   .0vr   r   r   
<listcomp>.       z._int_or_none_list_arg_type.<locals>.<listcomp>   zArgument requires z! integers or None, separated by ''z/'. Missing values will be filled with defaults.c                    r   r   r   r   r   r   r   r    <   r!   N)splitlenr   loggingwarningextend)r   r   r   r   r   items	num_itemsdefault_itemsr   r   r   _int_or_none_list_arg_type   s"   
r,   cache_requestsc                 C   s(   | du ri S | dv | dk| dkd}|S )z3Convert a request caching argument to a dictionary.N>   truerefreshr/   delete)r-   rewrite_requests_cachedelete_requests_cacher   )r-   request_caching_argsr   r   r   request_caching_arg_to_dictB   s   r4   parserc                 C   sB   | j D ]}|jdv s|jdurq|jdu rtd|j dqdS )zH
    Check to make sure all CLI args are typed, raises error if not
    )helpcommandNz
Argument 'z ' doesn't have a type specified.)_actionsdestconsttyper   )r5   actionr   r   r   check_argument_typesO   s   

r=   argc                 C   sz   |   dkrdS |   dkrdS |  rt| S zt| W S  ty<   zt| W  Y S  ttfy;   |  Y  Y S w w )Nr.   TfalseF)r   	isnumericr   floatr   astliteral_evalSyntaxError)r>   r   r   r   handle_cli_value_string]   s   
rE   argsc              	   C   sf   i }| s|S dd |  dD D ] \}}t|}||v r,td| d|| d| |||< q|S )z6Parse model arguments from a string into a dictionary.c                 s   s    | ]	}| d dV  qdS )=r"   N)r$   )r   r   r   r   r   	<genexpr>s   s    z"key_val_to_dict.<locals>.<genexpr>r   zOverwriting key 'z':  -> )r$   rE   eval_loggerr'   )rF   reskr   r   r   r   key_val_to_dictm   s    
rM   c                   @   sF   e Zd ZdZ	d
dejdejdeee	 B dB dedB ddf
dd	Z
dS )MergeDictActionzGArgparse action that parses key=value args and merges them into a dict.Nr5   	namespacevaluesoption_stringr   c              
      s   t || ji p
i  |sd S t|d }t|tr!i  | n2|rS|D ]-t   @  }rMt	|p;| j dd
 fdd|D     q%t|| j  d S )Nr   z: Overwriting z, c                 3   s,    | ]}| d  | d| V  qdS )z: rI   Nr   )r   rL   currentr   r   r   rH      s   * z+MergeDictAction.__call__.<locals>.<genexpr>)vars
setdefaultr9   r   r   r   rM   keysrJ   r'   joinupdatesetattr)selfr5   rO   rP   rQ   resultoverlapr   rR   r   __call__~   s   
(zMergeDictAction.__call__N)__name__
__module____qualname____doc__argparseArgumentParser	Namespacestrr   r   r]   r   r   r   r   rN   {   s    rN   c                   @   s   e Zd ZdddZdS )	SplitArgsNc                 C   sZ   t || jpg }|pg }|sJ d| j d|D ]
}||d qt|| j| d S )Nz--z passed without any valuesr   )getattrr9   r(   r$   rY   )rZ   r5   rO   rP   rQ   r)   r   r   r   r   r]      s   zSplitArgs.__call__r^   )r_   r`   ra   r]   r   r   r   r   rg      s    rg   )r   )rc   rB   r	   r&   collections.abcr   typingr   	getLoggerr_   rJ   rf   r   r   r   listr,   boolr4   rd   r=   rA   rE   rM   ActionrN   rg   r   r   r   r   <module>   s8    
2

&"