o
    )Ti-                     @   s  U d Z ddlZddlZddlmZ ddlmZ ddl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 dd	lmZ g d
Ze Zdadd Zdd Zdd Zdd Zdd Zd`ddZ eeedZ!e"e#e	f e$d< i Z%e"e#e&e'e( df f e$d< ddddZ)e"e#e*f e$d< i Z+e"e#e,e# f e$d< d e#fd!d"Z-dad#e
e# d e&e'e( df fd$d%Z.d&d' Z/d(d) Z0e.erd*nd+Z1d,e#fd-d.Z2dbd,e#d/e*fd0d1Z3dddd2Z4ddd3Z5d4d5 Z6d6d7 Z7d8d9 Z8d:d; Z9d<d= Z:e6e8e8e9e:e9d>Z;e"e#e	f e$d?< er
e7e;d@< dAdAdBdAdCZ<e"e#e#f e$dD< dEe#fdFdGZ=dbdHedIe"dEe#dJe*d e#f
dKdLZ>	M	dcd#e#dNe	e#gef dOe&e'e( df dPe*fdQdRZ?d#e#fdSdTZ@dUe#dVe	ege#f fdWdXZAdddZd[ZBe?d\e e.d\ d]e'e d e'e fd^d_ZCdS )ez$Code related to loading and dumping.    N)HelpFormatter)suppress)AnyCallableOptional   )load_value_modeparent_parser)import_jsonnetimport_toml_dumpsimport_toml_loadsomegaconf_supportpyyaml_availableruamel_support)ArgumentParser)
get_loader
set_loader
set_dumperc                 C   s   |   } | dkr
dS | dkrdS | dkrd S z<|  s(| dr-| dd   r-t| W S | dd	dd
d	ddd	d rMd
| v sHd| v rPt| W S W tS W tS  ty\   Y tS w )NtrueTfalseFnull-r   . e   )stripisdigit
startswithintreplacefloat
ValueError
not_loadedvalue r&   Q/home/ubuntu/.local/lib/python3.10/site-packages/jsonargparse/_loaders_dumpers.py
load_basic   s*   "
&
r(   c                  C   sj   t rt S dd l} G dd dt| d| j}dd }||d ||d |dtd	tjtd
 |a t S )Nr   c                   @   s   e Zd ZdS )z.get_yaml_default_loader.<locals>.DefaultLoaderN)__name__
__module____qualname__r&   r&   r&   r'   DefaultLoader:   s    r,   CSafeLoaderc                    sF   d| j vr| j | _| j D ]\}} fdd|D | j|< qd S )Nyaml_implicit_resolversc                    s    g | ]\}}| kr||fqS r&   r&   ).0tagregexptag_to_remover&   r'   
<listcomp>C   s    zMget_yaml_default_loader.<locals>.remove_implicit_resolver.<locals>.<listcomp>)__dict__r.   copyitems)clsr3   first_lettermappingsr&   r2   r'   remove_implicit_resolver>   s   

z9get_yaml_default_loader.<locals>.remove_implicit_resolverztag:yaml.org,2002:timestampztag:yaml.org,2002:floata	  ^(?:
        [-+]?(?:[0-9][0-9_]*)\.[0-9_]*(?:[eE][-+]?[0-9]+)?
        |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
        |\.[0-9_]+(?:[eE][-+][0-9]+)?
        |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*
        |[-+]?\.(?:inf|Inf|INF)
        |\.(?:nan|NaN|NAN))$z-+0123456789.)	yaml_default_loaderyamlgetattr
SafeLoaderadd_implicit_resolverrecompileXlist)r=   r,   r;   r&   r&   r'   get_yaml_default_loader3   s"   
	

rE   c                 C   s   dd l }|j| t d}t|trP|rPtdd | D rPt|dkr4|  t	t
|d kr4| }|S t| ddd	d
}t|dkrP|t|krP| }|S )Nr   )Loaderc                 s   s    | ]}|d u V  qd S Nr&   )r/   vr&   r&   r'   	<genexpr>a       zyaml_load.<locals>.<genexpr>r   :z {} r   ,)r=   loadrE   
isinstancedictallvalueslenr   nextitersetr    split)streamr=   r%   keysr&   r&   r'   	yaml_load]   s   $$rZ   c                 C   s   dd l }|| S Nr   )jsonloads)r%   r\   r&   r&   r'   	json_loadk   s   
r^   c                 C   s   t d\}}|| S )N	toml_load)r   )r%   
toml_loads_r&   r&   r'   r_   q   s   r_   r   c                 C   s   ddl m} ||\}}td}z|j|| ||d}W t|S  tyA   zt| W  Y S  ty@ } ztt	||d }~ww w )Nr   )ActionJsonnetjsonnet_load)ext_vars	ext_codes)
_jsonnetrb   split_ext_varsr
   evaluate_snippetRuntimeErrorjson_or_yaml_loadjson_or_yaml_loader_exceptionsr"   str)rX   pathrd   rb   re   rf   valexr&   r&   r'   rc   v   s   rc   )r=   r\   tomlloaders.loader_exceptionsTFloader_json_supersetloader_paramsreturnc                  C   s.   t  } | d u rt }|d usJ |j} | S rG   )r   getr	   parser_mode)modeparserr&   r&   r'   get_load_value_mode   s   rz   rx   c                 C   s   | d u rt  } | tvrK| dkrtdjft| < t|  S | dkr+tdjft| < t|  S | dkr<tdd ft| < t|  S | dkrKttrEdndtf S t|  S )Nr=   r\   rp   get_loader_exceptionsr   jsonnet)	rz   rr   
__import__	YAMLErrorJSONDecodeErrorr   r{   r   r"   rx   r&   r&   r'   r{      s   r{   c                 C   s.   t rt| tr|  dkr| S t| S t| S )Nr   )r   rO   rl   r   rZ   r^   r$   r&   r&   r'   rj      s
   rj   c                 C   s   t | }|tur
|S t| S rG   )r(   r#   rj   )r%   loaded_valuer&   r&   r'   basic_json_or_yaml_load   s   r   r=   r\   r%   c                 C   sp   |   }|dr|ds|dr6|dr6dd l}t|j ||W  d    S 1 s1w   Y  tS )N[]{}r   )r   r   endswithr\   r   r   r]   r#   )r%   r   r\   r&   r&   r'   load_list_or_dict   s   ( r   simple_typesc                    s   |   dkr| S t| }t }|tu rt|dst| }|tu rP|tvr-|dv r-t| t| }i }|rH|t	v rHt	|   fdd|
 D }|| fi |}|s]t|ttttfr]| }|S )Nr   T>   
omegaconf+	omegaconfc                    s   i | ]\}}| v r||qS r&   r&   )r/   krH   paramsr&   r'   
<dictcomp>   s    zload_value.<locals>.<dictcomp>)r   r(   rz   r#   rs   rv   r   rq   set_omegaconf_loaderrt   r7   rO   r   r!   boolrl   )r%   r   kwargsr   rx   loaderload_kwargsr&   r   r'   
load_value   s$   r   )default_flow_styleallow_unicode	sort_keys)ensure_asciir   c                 C   s   dd l }|j| fi tS r[   )r=   	safe_dumpdump_yaml_kwargs)datar=   r&   r&   r'   	yaml_dump   s   r   c                 C   s*   t d | }t|j}||j}||S )Nr=   )dumpers#create_help_formatter_with_commentsformatter_classprogadd_yaml_comments)r   ry   dumpr   	formatterr&   r&   r'   yaml_comments_dump   s   


r   c                 C   s   dd l }|j| fdditS )Nr   
separators)rM   rK   r\   dumpsdump_json_kwargsr   r\   r&   r&   r'   json_compact_dump   s   r   c                 C   s"   dd l }|j| fdditd S )Nr   indentr   
r   r   r&   r&   r'   json_indented_dump   s   r   c                 C   s   t d}|| S )N	toml_dump)r   )r   
toml_dumpsr&   r&   r'   r     s   r   )r=   r\   json_compactjson_indentedrp   r|   r   yaml_commentsz# z// )r=   r   r|   rp   comment_prefixdump_formatc                 C   s(   | dh ttvrtd|  dd S )Nrw   zUnknown output format "z".)unionrV   r   r"   )r   r&   r&   r'   check_valid_dump_format  s   r   ry   r   with_commentsc                    s   |dkr| j tv r| j nd}|r,| dtvr'|dkrtdtd| d| d}|dr5|| fn|f}t| | }| jr^t|r^t|  d fdd	| jD }| d| }|S )
Nrw   r=   	_commentsz7ruamel.yaml is required for dumping YAML with comments.z3Dumping with comments is not supported for format 'z'.r   c                 3   s    | ]} | V  qd S rG   r&   )r/   lineprefixr&   r'   rI   0  rJ   z$dump_using_format.<locals>.<genexpr>)rw   r   r"   r   dump_headerr   rv   join)ry   r   r   r   argsr   headerr&   r   r'   dump_using_format#  s   
r   r&   	loader_fn
exceptionsjson_supersetc                 C   sH   |t | < |t| < |t| < ttt|jdd }|r"|t| < dS dS )a  Sets the value loader function to be used when parsing with a certain mode.

    The ``loader_fn`` function must accept as input a single str type parameter
    and return any of the basic types {str, bool, int, float, list, dict, None}.
    If this function is not based on PyYAML for things to work correctly the
    exceptions types that can be raised when parsing a value fails should be
    provided.

    Args:
        mode: The parser mode for which to set its loader function. Example: "yaml".
        loader_fn: The loader function to set. Example: ``yaml.safe_load``.
        exceptions: Exceptions that the loader can raise when load fails.
            Example: (yaml.YAMLError,).
        json_superset: Whether the loader can load JSON data.
    r   N)	rq   rr   rs   rV   rD   inspect	signature
parametersrt   )rx   r   r   r   r   r&   r&   r'   r   5  s   r   c                 C   s   t |  S )z5Returns the current loader function for a given mode.)rq   r   r&   r&   r'   r   R  s   r   format_name	dumper_fnc                 C   s   |t | < dS )zSets the dumping function for a given format name.

    Args:
        format_name: Name to use for dumping with this function. Example: ``yaml_custom``.
        dumper_fn: The dumper function to set. Example: ``yaml.safe_dump``.
    N)r   )r   r   r&   r&   r'   r   W  s   r   r   c                 C   s<   t r| tvrddlm} || }t| |td d S d S d S )Nr   )get_omegaconf_loaderr=   )r   rq   
_optionalsr   r   r{   )rx   r   r   r&   r&   r'   r   a  s
   r   r|   r   c                    s$   ddl m  G  fddd| }|S )a  Creates a dynamic class that combines a formatter with YAML comment functionality.

    Args:
        formatter_class: The base formatter class to extend.

    Returns:
        A new class that inherits from both the formatter and YAMLCommentFormatter.
    r   YAMLCommentFormatterc                       s0   e Zd Z fddZdedefddZ  ZS )zAcreate_help_formatter_with_comments.<locals>.DynamicHelpFormatterc                    s    t  j|i |  | | _d S rG   )super__init___yaml_formatter)selfr   r   )r   	__class__r&   r'   r   x  s   zJcreate_help_formatter_with_comments.<locals>.DynamicHelpFormatter.__init__cfgru   c                 S   s   | j |S )z Adds help text as yaml comments.)r   r   )r   r   r&   r&   r'   r   |  s   zScreate_help_formatter_with_comments.<locals>.DynamicHelpFormatter.add_yaml_comments)r)   r*   r+   r   rl   r   __classcell__r&   r   )r   r'   DynamicHelpFormatterw  s    r   )_formattersr   )r   r   r&   r   r'   r   l  s   		r   )r   NrG   )F)r&   T)r   )D__doc__r   rA   argparser   
contextlibr   typingr   r   r   _commonr   r	   r   r
   r   r   r   r   r   _type_checkingr   __all__objectr#   r<   r(   rE   rZ   r^   r_   rc   rq   rP   rl   __annotations__rr   tupletype	Exceptionrs   r   rt   rV   rz   r{   rj   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s     *
 $	
 


