o
    )Ti                  	   @   sB  d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
mZ 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mZmZ ddlmZ dgZe
dZe jje jjhZG dd dZ de	e dee!ee"f de#e"e	e f fddZ$de	e de"ddfddZ%de	e de"ddfddZ&de	e de"ddfddZ'dS )    N)wraps)PathLikePath)OptionalTypeTypeVarUnion   )parser_context)ArgumentParser)get_loader_exceptions
load_value)_get_config_read_mode)is_subclass_specresolve_class_path_by_name)import_objectFromConfigMixinTc                       sp   e Zd ZU dZdZeeeef  e	d< i Z
ee	d< d fddZedee d	eeeef defd
dZ  ZS )r   a)  Mixin class that adds from config support to classes.

    This mixin does two things:

        1. Adds support for overriding ``__init__`` defaults by defining a
           ``__from_config_init_defaults__`` class attribute pointing to a
           config file path. The overriding of defaults happens on subclass
           creation time. Inspecting the signature will give the overridden
           defaults.

        2. Adds a ``from_config`` ``@classmethod``, that instantiates the class
           based on a config file or dict.

    Attributes:
        ``__from_config_init_defaults__``: Optional path to a config file for
            overriding ``__init__`` defaults.
        ``__from_config_parser_kwargs__``: Additional kwargs to pass to the
            ArgumentParser used for parsing configs.
    N__from_config_init_defaults____from_config_parser_kwargs__returnc                    s"   t  jdi | t| | j dS )zGOverride ``__init__`` defaults for the subclass based on a config file.N )super__init_subclass___override_init_defaultsr   )clskwargs	__class__r   M/home/ubuntu/.local/lib/python3.10/site-packages/jsonargparse/_from_config.pyr   ,   s   z!FromConfigMixin.__init_subclass__r   configc                 C   s&   t | |fi | j\}} | di |S )zInstantiate current class based on a config file or dict.

        Args:
            config: Path to a config file or a dict with config values.
        Nr   )_parse_class_kwargs_from_configr   )r   r!   r   r   r   r    from_config1   s   zFromConfigMixin.from_config)r   N)__name__
__module____qualname____doc__r   r   r	   strr   __annotations__r   dictr   classmethodr   r   r#   __classcell__r   r   r   r    r      s   
 .r   r!   r   c                    s  t dddi|}t|tsXddlm} ||t d}| }t|jd+ z
t	|t
|d}W n t yH } ztd| d	| |d
}~ww W d
   n1 sSw   Y  t|tsdtd| t|rt| |d }t|}	t|	| std| d| j d|	} i |di |di }||  |jD ] t fdd|jD d
}
d|
_q|j  |j|dd}|| | fS )z=Parse the init kwargs for ``cls`` from a config file or dict.exit_on_errorFr
   r   )mode)load_value_mode)pathzProblems parsing config 'z': Nz3Expected config to be a dict or parse into a dict: 
class_pathzClass 'z' is not a subclass of ''	init_argsdict_kwargsc                 3   s    | ]
}|j  kr|V  qd S N)dest).0arequiredr   r    	<genexpr>W   s    z2_parse_class_kwargs_from_config.<locals>.<genexpr>)defaultsr   )r   
isinstancer*   typingr   r   get_contentr   parser_moder   r(   r   	TypeErrorr   r   r   
issubclassr$   getadd_class_argumentsrequired_argsnext_actions	_requiredclearparse_objectinstantiate_classesas_dict)r   r!   r   parserr   cfg_pathcfg_strexr1   objactioncfgr   r9   r    r"   <   s<   





r"   parser_kwargsc                 C   st   t | dd}t|tttdfstdt|ttfr!t| s#dS t| |fi |\}} t	| | t
| | dS )zVOverride ``__init__`` defaults for ``cls`` based on ``__from_config_init_defaults__``.r   Nz<__from_config_init_defaults__ must be str, PathLike, or None)getattrr=   r(   r   typerA   r   is_filer"   "_override_init_defaults_this_class&_override_init_defaults_parent_classes)r   rT   r!   r<   r   r   r    r   ^   s   
r   r<   c           	      C   s   t | jj}|  D ]_\}}||}|rl|jtv rl|j	t j
kr,td|j d|| |jt jjkr?|| jj|< qdd | D }t||t| }| jjpXd}|d | |f ||d d   | j_qd S )Nz0Overriding of required parameters not allowed: 'r2   c                 S   s&   g | ]}|j tv r|jtjkr|qS r   )kindOVERRIDE_KINDSdefaultinspect_emptyr7   pr   r   r    
<listcomp>v   s   & z6_override_init_defaults_this_class.<locals>.<listcomp>r   r
   )r]   	signature__init__
parameterscopyitemsrC   rZ   r[   r\   r^   rA   namepop	ParameterKEYWORD_ONLY__kwdefaults__valueslistindexlen__defaults__)	r   r<   paramsrg   r\   paramr:   rn   auxr   r   r    rX   k   s   

&rX   c                    s"  g }t | dd  D ]1}|s n,t |jjfdd|D }|D ]}t j|t jj||| jd}|	| q#q|sAd S | j t | j}t
|j }d }	|rb|d jt jjkrb| }	|D ]}
|	|
 qd|	rs|	|	 dd |D t  fdd	}|j|d
|_|| _d S )Nr
   c                    s   g | ]}| v r|qS r   r   )r7   rg   )rq   r   r    ra      s    z:_override_init_defaults_parent_classes.<locals>.<listcomp>)rg   rZ   r\   
annotationc                 S   s   i | ]}|j |jqS r   )rg   r\   r_   r   r   r    
<dictcomp>   s    z:_override_init_defaults_parent_classes.<locals>.<dictcomp>c                     s0     D ]\}}||vr|||< q | i |S r5   )rf   )argsr   rg   r\   )original_initparent_defaultsr   r    wrapper   s
   z7_override_init_defaults_parent_classes.<locals>.wrapper)rd   )r]   getmrorb   rc   rd   ri   rj   rh   rt   appendrm   rl   rZ   VAR_KEYWORDr   replace__signature__)r   r<   override_parent_paramsbasenamesrg   	new_paramoriginal_sigrd   kwargs_paramrr   rz   r   )rx   rq   ry   r    rY   |   s@   	

rY   )(r]   	functoolsr   osr   pathlibr   r>   r   r   r   r	   _commonr   _corer   _loaders_dumpersr   r   
_optionalsr   
_typehintsr   r   _utilr   __all__r   ri   rj   POSITIONAL_OR_KEYWORDr[   r   r(   r*   tupler"   r   rX   rY   r   r   r   r    <module>   s&    0("