o
    )Ti[                     @   s,  U d Z ddlZddlmZ ddlm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mZmZmZmZ d	dlmZ d	dlmZmZmZ d	dlmZ d	dlmZm Z m!Z!m"Z"m#Z# d	dl$m%Z%m&Z& dgZ'	d,de&de(deee)e e*e)e df f  dee+e  fddZ,	d,de&de(deee)e e*e)e df f  deeee%f  fddZ-edddZ.ee/d< e	dd Z0G dd  d Z1G d!d" d"eZ2	d,de&de(deee)e e*e)e df f  deeee%f  fd#d$Z3e4 fde&d%e(de+e2 fd&d'Z5d(e2de6fd)d*Z7G d+d dZ8dS )-z!Code related to argument linking.    N)SUPPRESS)Action)defaultdict)contextmanager)
ContextVar)AnyCallableOptionalUnion   )r   ActionConfigFile_ActionConfigLoad_ActionPrintConfigfilter_non_parsing_actions)parser_context)	Namespace	split_keysplit_key_leaf)get_signature_parameters)ActionSubCommandsfind_parent_action!find_parent_action_and_subcommandget_subcommandget_subcommands)ArgumentGroupArgumentParserArgumentLinkingparserkeyexclude.returnc                    sp   g }t | | d}|d ur|g}nt| j} d ur# fdd|D }|d fdd|D }|g kr6d S |S )Nr   c                    s   g | ]	}t | s|qS  )
isinstance.0ar!   r"   P/home/ubuntu/.local/lib/python3.10/site-packages/jsonargparse/_link_arguments.py
<listcomp>-       z0find_parent_or_child_actions.<locals>.<listcomp>.c                    s   g | ]
}|j  r|qS r"   )dest
startswithr$   )prefixr"   r'   r(   /   s    )r   r   _actions)r   r   r   foundactionactionsr"   )r   r-   r'   find_parent_or_child_actions!   s   
r2   c                 C   sj   ddl m} t| ||d}||r|S |t|d h}| jD ]}t|dd |v r2t|dr2|  S qd S )Nr   ActionTypeHintr!   r   r+   instantiate_class)
_typehintsr4   r   is_subclass_typehintr   _action_groupsgetattrhasattr)r   r   r   r4   r0   key_setgroupr"   r"   r'   #find_subclass_action_or_class_group3   s   

r=   apply_config_skipF)defaultc               	   c   s0    t d} zd V  W t |  d S t |  w )NT)r>   setreset)tr"   r"   r'   skip_apply_linksG   s
   
rC   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
DirectedGraphc                 C   s   g | _ tt| _d S N)nodesr   list
edges_dictselfr"   r"   r'   __init__Q   s   zDirectedGraph.__init__c                 C   s\   ||fD ]}|| j vr| j | q| j| j | }| j |}||vr,|| d S d S rE   )rF   appendrH   index)rJ   sourcetargetnodesource_targets_listtarget_indexr"   r"   r'   add_edgeU   s   
zDirectedGraph.add_edgec                    sb   dgt  j }dgt  j }g }tt  jD ]}|| s' |||| q fdd|D S )NFc                    s   g | ]} j | qS r"   )rF   )r%   nrI   r"   r'   r(   e       z7DirectedGraph.get_topological_order.<locals>.<listcomp>)lenrF   rangetopological_sort)rJ   	exploringvisitedorderrN   r"   rI   r'   get_topological_order^   s   z#DirectedGraph.get_topological_orderc                 C   sx   d||< | j | D ]"}|| rtd| j|  d| j|  || s+| |||| q	d||< d||< |d| d S )NTz'Graph has cycles, found while checking  --> Fr   )rH   
ValueErrorrF   rX   insert)rJ   rN   rY   rZ   r[   rO   r"   r"   r'   rX   g   s   zDirectedGraph.topological_sortN)__name__
__module____qualname__rK   rS   r\   rX   r"   r"   r"   r'   rD   P   s
    		rD   c                	       s   e Zd Z		d'deeeedf f dedee def fdd	Zd
e	fddZ
dd Zdd Zd(ddZdd Zededed
dfddZed)ddZedd Zedd deded
dfdd Zed!d" Zed#d$ Zed%d& Z  ZS )*
ActionLinkNparserN   .rO   
compute_fnapply_onc              
      s  t dsd_| _|| _t|tr|fn| | _}|| _|| _	| 
|| ttttf |dkrS fdd|D | _| jD ]\}}|d u rQtd| qBn fdd|D | _|t| df| _| j| jg D ]\}}|d u rtd	| d
qo| jd d usJ ddlm} ddlm}	 t| jd |}
|	j| jd ddd}|o|| jd j d}| jd j|k}|s|r|s| jd j d}td| d| d
|
rj| jd  j|= tjD ]}|j|ks|j| drj| qn|r|rt| jd tsJ | jd j D ]}| j!|< q| jj"| jd < jD ]U}| jd |j#v r|j#| jd  |rj| jd j d}|j#D ]}|j|krh|j#|  nqX|j#rt$dd |j#D rd|j#d j d|_%|j#&  q5|j'v rj'| |r|s| jd j(}d|vrt) |d< |*ddd }|d +| jj#,|  |dkrz| - W n ty } ztd|d  d| d| |d }~ww |d u r|d }nt.|dt|d  d!/| d" }|d| 7 }|r!|s!d }d#| jd j d$}n=|
r1| jd j0}| jd j1}nt| jd ts<J t.| jd d%| jd j2}| jd j3}|d u r^d&| jd j d'}t4 j5|g|t6d(| j d)||d* d S )+N_links_groupzLinked argumentsinstantiatec                       g | ]}|t | d fqS r!   )r=   r%   sr   r   r"   r'   r(      s    z'ActionLink.__init__.<locals>.<listcomp>zXLinks applied on instantiation require source to be a subclass action or a class group: c                    ri   rj   )r2   rk   rm   r"   r'   r(      s    r!   zNo action for key "".r   )r   r3   FTall_subtypes
also_lists.init_args.z#Target key expected to start with "z", got "r*   z.helpc                 s   s    | ]}t |tV  qd S rE   )r#   r   r$   r"   r"   r'   	<genexpr>   s    z&ActionLink.__init__.<locals>.<genexpr>zGroup 'r   z(': All arguments are derived from links.linked_targetszInvalid link r]   z: r`   (, )zUse --z.help for details.	_typehintzTarget 'z' lacks type and helpz[applied on ])r+   r?   metavartypehelp)7r:   add_argument_grouprg   r   _targetr#   str_sourcerf   re   _initial_input_checksrc   r   r   r   rN   r^   find_parent_action_or_grouprO   _corer   r6   r4   r7   r,   r+   r8   removegroupsrG   r.   ArgparseActionoption_strings_option_string_actionsrM   _group_actionsalldescriptionclearrequired_argssub_add_kwargsr@   splitaddrL   instantiation_orderr9   joingroup_classtitler{   r|   superrK   r   )rJ   r   rN   rO   re   rf   r   r0   r   r4   is_target_groupis_target_subclassvalid_target_init_argvalid_target_leafr-   r<   	help_destr   	subtargetexlink_str	type_attrhelp_str	__class__rm   r'   rK   v   s   






 

"

zActionLink.__init__r    c                 C   s   | j | j| j| jdS )N)rN   rO   rf   re   )r   r~   rf   re   rI   r"   r"   r'   
get_kwargs   s
   zActionLink.get_kwargsc                 C   s   | j dvr	td| jd u rt|tst|dkstd| j dkrf| jjj}dd |D }||v r:td| d	t|trB|gn|D ]}||v rRtd
| dqDdd |D }||v rhtd| dd S d S )N>   rd   rh   z*apply_on must be 'parse' or 'instantiate'.r   z1Multiple source keys requires a compute function.rd   c                 S   s   h | ]}|j d  qS )r   )rO   r$   r"   r"   r'   	<setcomp>
  rU   z3ActionLink._initial_input_checks.<locals>.<setcomp>zTarget "z&" is already a target of another link.zSource "z5" not allowed since it is the target of another link.c                 S   s*   h | ]}|j D ]}|jd kr|d qqS )rd   r   )rN   rf   )r%   r&   rl   r"   r"   r'   r     s   * z5" not allowed since it is the source of another link.)	rf   r^   re   r#   r   rV   r   rg   r   )rJ   rN   rO   link_actionsexisting_targetssrcexisting_sourcesr"   r"   r'   r      s$   
 

z ActionLink._initial_input_checksc                 O   s2   d dd | jD }td| jd  d| d)Nrv   c                 s   s    | ]}|d  V  qdS )r   Nr"   rk   r"   r"   r'   rs         z&ActionLink.__call__.<locals>.<genexpr>zLinked "r   z" must be given via "rn   )r   rN   	TypeErrorrO   )rJ   argskwargsrN   r"   r"   r'   __call__  s   zActionLink.__call__c                 C   s   | j | jd || jd |S )Nr   r   )r   _check_value_keyrO   )rJ   valuecfgr"   r"   r'   _check_type  s   zActionLink._check_typec              
   C   sn   zt | jsJ | j| W S  ty6 } z| jd }ddd |D }td| d| d| |d }~ww )Nr   rv   c                 s   s    | ]}t |V  qd S rE   )r   r$   r"   r"   r'   rs   "  r   z-ActionLink.call_compute_fn.<locals>.<genexpr>zCall to compute_fn of link 'z' with args (z
) failed: )callablere   	Exceptionr   r   r^   )rJ   r   r   linkr"   r"   r'   call_compute_fn  s   
zActionLink.call_compute_fnr   r   c              	      s  t  s	t| rd S t|  dd\}}|r"| v r"t| |  t| ds)d S t| dD ]}ddl	m
} g }d}|jD ]B\}}	||	d r`| vr`| jd|jd  d	| d
 d} n  fdd|	D D ]}
| |
 |
j |
jd  qi| |  q=|rq.|jd u r|d }|j\}}t|trt||r||jk}|r||js|| r| }n.t|j}t|D ]\}}|t|k rt|| tr||jr||  ||< q||}t || | j | jd|jd  d q.d S )NF)fail_no_subcommandrg   rd   r   r3   r   Link 'z' ignored since source 'z' not found in namespace.Tc                    s   g | ]	}|j  v r|qS r"   )r+   r$   r   r"   r'   r(   ;  r)   z2ActionLink.apply_parsing_links.<locals>.<listcomp>Applied link ''.)!r>   getr   is_print_config_requestedr   rc   apply_parsing_linksr:   get_link_actionsr6   r4   rN   r7   loggerdebugr   r   r+   rL   re   rO   r#   r   is_mapping_typehintrx   is_init_arg_mapping_typehintas_dictr   	enumeraterV   
annotationr   set_target_value)r   r   
subcommand	subparserr0   r4   r   	skip_link
source_keysource_actionsource_action_nr   
target_keytarget_actionsame_keyparamsrT   paramr"   r   r'   r   %  sb   








zActionLink.apply_parsing_linksc                 C   s  t | dsd S d}||v r||nt }t| d|d}|r&|r&t||}|D ]}|jd }|s=||ks=|| drAt|rBq(g }	|j	D ]F\}
}||j
 }|
|j
kr[|	| qGt|
d }ddlm} ||rt ||s| jd	|jd  d
| d| d qG|	t|| qG|	sq(|jd u r|	d }n||	}t|||| j ||_|| | jd|jd  d q(|r|||< d S d S )Nrg   __applied_instantiation_links__rh   )skipr   r*   r   r3   r   z' ignored since attribute 'z' not found in source r   r   )r:   popr@   r   rc   reorderrO   r,   is_nested_instantiation_linkrN   r+   rL   r   r6   r4   r7   r   r   r   r9   re   r   r   applied_valuer   )r   r   rO   r[   applied_keyapplied_linksr   r0   r   source_objectsr   r   source_objectattrr4   r   r"   r"   r'   apply_instantiation_linksZ  sT   







z$ActionLink.apply_instantiation_linksc                    sR   dt f fdd}g }t| dD ]}|jd  u r&t|r&|||  q|S )Nr   c                    sJ   |   } t fdd| d D | d< | d t j dd  | d< | S )Nc                 3   s(    | ]}|t  j d d V  qdS r*   N)rV   r+   )r%   kr0   r"   r'   rs     s   & zGActionLink.get_nested_links.<locals>.trim_param_keys.<locals>.<genexpr>rN   rO   rr   )copytuplerV   r+   )r   r   r"   r'   trim_param_keys  s    z4ActionLink.get_nested_links.<locals>.trim_param_keysrh   r   )dictr   rO   r   rL   r   )r   r0   r   linksr   r"   r   r'   get_nested_links  s   zActionLink.get_nested_linksr0   r   c           	         s   | j \}}|s	J ddlm} |j|dddrl||jkr"|| nJt|jts*J ||j}|t	|jd d   t|t
rZt fdd|D rZ|D ]
} |v rW|| < qMd S ||vrl|d| jd	  d
 d S |||< d S )Nr   r3   FTro   c                 3   s"    | ]}t |to |v V  qd S rE   )r#   r   )r%   i	child_keyr"   r'   rs     s     z.ActionLink.set_target_value.<locals>.<genexpr>r   r   z!' ignored since target not found.)rO   r6   r4   r7   r+   r   r#   r   r   rV   rG   anyr   r   )	r0   r   r   r   r   r   r4   parentitemr"   r   r'   r     s&   

 zActionLink.set_target_valuec                 C   s  t | d}|rt }t }|D ]$}tddt|jd d }|jD ]\}}||j	| q"|
| qt|dd d}|d h}|dd  D ]5}d	d
 |dddD }	tt|	d D ]}
d|	d |
d  }||v rv||| q_|
| qG| S g S )Nrh   z\.init_args$ r   c                 S   s   t t| S rE   )rV   r   )xr"   r"   r'   <lambda>  s    z0ActionLink.instantiation_order.<locals>.<lambda>)r   r   c                 S   s   g | ]}| d dqS )|r*   )replace)r%   r   r"   r"   r'   r(     s    z2ActionLink.instantiation_order.<locals>.<listcomp>z
init_args.z
init_args|r*   )r   r@   rD   resubr   rO   rN   rS   r+   r   sortedr   r   rW   rV   r   r\   )r   r1   targetsgraphr0   rO   _r   seen_targetspartsnumtarget_prefixr"   r"   r'   r     s*   

zActionLink.instantiation_orderc                 C   sX   g }| D ]#}g }|D ]}||j ks|j |d r|| q
|| q
|}q|| S Nr*   )r+   r,   rL   )r[   
componentsorderedr   after	componentr"   r"   r'   r     s   zActionLink.reorderc           	         s   fdd}dd | j D D ]	}||jd  qddlm   fdd| j D D ]}|jd	g D ]}||j d
|  q1q(tdd t| \}}W d    n1 sVw   Y  |d urvt	|D ]\}}|v rut
|| |  qcd S d S )Nc                    sF     | d  d| vrd S t| \}}| v r | s! |= d S d S d S r   )r   r   )r   
parent_keyr   r   r"   r'   del_target_key  s   
z9ActionLink.strip_link_target_keys.<locals>.del_target_keyc                 S   s   g | ]	}t |tr|qS r"   )r#   rc   r$   r"   r"   r'   r(     r)   z5ActionLink.strip_link_target_keys.<locals>.<listcomp>r   r   r3   c                    s$   g | ]}t | rt|d r|qS )r   )r#   r:   r$   r3   r"   r'   r(     s   $ rt   rr   F)single_subcommand)r.   rO   r6   r4   r   r   r+   r   r   r   rc   strip_link_target_keys)	r   r   r  r0   r   subcommands
subparsersr   r   r"   )r4   r   r'   r    s$   z!ActionLink.strip_link_target_keysNrd   rE   )NN)r`   ra   rb   r
   r   r   r	   r   rK   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r  __classcell__r"   r"   r   r'   rc   u   s@     
	4.


rc   c                 C   s4   t | ||dd }|s| jr|| jv r| j| S |S )Nr!   r   )r   r   )r   r   r   action_or_groupr"   r"   r'   r     s   
r   rf   c                    s&   t | dsg S  fdd| jjD S )Nrg   c                    s"   g | ]}|j  kr|vr|qS r"   )rf   r$   rf   r   r"   r'   r(     s   " z$get_link_actions.<locals>.<listcomp>)r:   rg   r   )r   rf   r   r"   r
  r'   r     s   
r   r0   c                    sj   ddl m} | j\}  sJ | j do4| o4t fdd| jD o4t fdd| jD S )Nr   r3   rr   c                 3   s    | ]	\}}| u V  qd S rE   r"   )r%   r   r&   r   r"   r'   rs   
  s    z/is_nested_instantiation_link.<locals>.<genexpr>c                 3   s&    | ]\}}|  j d V  qdS r   )r,   r+   )r%   r   r   r  r"   r'   rs     s   $ )r6   r4   rO   r,   r+   r7   r   rN   )r0   r4   r   r"   r  r'   r     s   
r   c                	   @   sD   e Zd ZdZ		ddeeeedf f dedee defd	d
Z	dS )r   zMethod for linking arguments.Nrd   rN   .rO   re   rf   c                 C   s   t | |||| dS )a  Makes an argument value be derived from the values of other arguments.

        Refer to :ref:`argument-linking` for a detailed explanation and examples.

        Args:
            source: Key(s) from which the target value is derived.
            target: Key to where the value is set.
            compute_fn: Function to compute target value from source.
            apply_on: At what point to set target value, 'parse' or 'instantiate'.

        Raises:
            ValueError: If an invalid parameter is given.
        N)rc   )rJ   rN   rO   re   rf   r"   r"   r'   link_arguments  s   zArgumentLinking.link_argumentsr  )
r`   ra   rb   __doc__r
   r   r   r	   r   r  r"   r"   r"   r'   r     s    rE   )9r  r   argparser   r   r   collectionsr   
contextlibr   contextvarsr   typingr   r   r	   r
   r.   r   r   r   r   _commonr   
_namespacer   r   r   _parameter_resolversr   _subcommandsr   r   r   r   r   _type_checkingr   r   __all__r   r{   r   rG   r2   r=   r>   __annotations__rC   rD   rc   r   r@   r   boolr   r   r"   r"   r"   r'   <module>   sp    



%   
 