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mZmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZ ddlmZmZ dgZe	di dZe	ed< dedefddZ 	d0deeef dedeee!e e"e!e df f  de"ee ee f fddZ#	d0deeef dedeee!e e"e!e df f  dee fddZ$	d0dededeee!e e"e!e df f  de"ee ee f fddZ%	d0dededeee!e e"e!e df f  dee fddZ&G d d deZ'ed!d" Z(	#	$d1ded%ed&ed'ede"ee)e  ee)e  f f
d(d)Z*	#	$d1ded%ed&ed'ede"ee ee f f
d*d+Z+	#	$d1ded%ed,ee d-ed&ed'eddfd.d/Z,dS )2z(Subcommands action and helper functions.    N)Action)_SubParsersAction)contextmanager)
ContextVar)NoReturnOptionalUnion   )filter_non_parsing_actions)parsing_defaultssingle_subcommand)	Namespace
NSKeyError	split_keysplit_key_root)ActionsContainerArgumentParserActionSubCommandsparse_kwargs)defaultkeyreturnc                 C   sj   t |d }t| jD ]'}t|tr'||jv r'|j| }t|t |d   S |j|d r2 dS qdS )Nr   r	   .TF)	r   r
   _actions
isinstancer   _name_parser_mapis_branch_keydest
startswith)parserr   root_keyaction	subparser r#   M/home/ubuntu/.local/lib/python3.10/site-packages/jsonargparse/_subcommands.pyr      s   
r   r   r   exclude.c                    s  t | j} dur fdd|D }|D ]B}t|tsq||jv r'|df  S t|d }||jv rVt|\}}|j| }t|| d\}	}
|
durP|d|
 7 }|	|f  S qd}|D ]'}|j|ksjd| |jv rdd	lm	}m
} t|||fr||}q[|df  S q[|dfS )
z6Finds an action in a parser given its destination key.Nc                    s   g | ]	}t | s|qS r#   )r   ).0ar%   r#   r$   
<listcomp>(   s    z.find_action_and_subcommand.<locals>.<listcomp>r   r(   r   z--r	   )
ActionFail_ActionConfigLoad)r
   r   r   r   r   r   find_action_and_subcommandr   option_stringsr*   r+   )r   r   r%   actionsr!   	root_dest
subcommandsubdestr"   	subactionsubsubcommandfallback_actionr*   r+   r#   r(   r$   r,       s4   




r,   c                 C      t | ||dd S Nr(   r   )r,   )r   r   r%   r#   r#   r$   find_actionF      r7   c              	   C   s   t | ||d\}}|d u r=d|v r=t|}ttt|d D ]}t | d|d |d  |d\}}|d ur< ||fS q||fS )Nr(   r   r	   )r,   r   reversedrangelenjoin)r   r   r%   r!   r0   partsnr#   r#   r$   !find_parent_action_and_subcommandN   s   $r?   c                 C   r5   r6   )r?   )r   r   r%   r#   r#   r$   find_parent_action]   r8   r@   c                   @   sT   e Zd ZU dZeed< eed< dedefddZdededefd	d
Z	dddZ
dS )r   zLExtension of argparse._SubParsersAction to modify subcommands functionality.parent_parser
env_prefixnamer   c                 K   s   t d)zLRaises a ``NotImplementedError`` since jsonargparse uses ``add_subcommand``.zFIn jsonargparse subcommands are added using the add_subcommand method.)NotImplementedError)selfrC   kwargsr#   r#   r$   
add_parserk   s   zActionSubCommands.add_parserr   c                 K   s   |j dur	td| j|krtd| d| j d| |_| j | d|_| jj|_| j|_| jj|_| jj	|_	| jj
|_
| jj|_||_|dd}d}d	|v rY|d	}| |||}| j| || j|< |D ]}|| j|< qm|S )
a  Adds a parser as a subcommand parser.

        In contrast to `argparse.ArgumentParser.add_subparsers
        <https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_subparsers>`_
        add_parser requires to be given a parser as argument.

        Args:
            name: The name for the subcommand.
            parser: The parser to use for the subcommand.
        Nz<Multiple levels of subcommands must be added in level order.z>A subcommand name can't be the same as the subcommands dest: 'z'.z [options] _aliasesr#   help)_subparsers
ValueErrorr   _prog_prefixprogrB   rA   default_envparser_mode_error_handlerexit_on_errorloggerr0   pop_ChoicesPseudoAction_choices_actionsappendr   )rE   rC   r   rF   rI   help_argchoice_actionaliasr#   r#   r$   add_subcommando   s.   








z ActionSubCommands.add_subcommandNc           
      C   s   |d }|dd }||| j < || jv rA| j| }||v r$|| nd}tddddt }	|j|fd|i|	||< dS dS )z5Adds subcommand dest and parses subcommand arguments.r   r	   NT)_skip_validation_namespace_as_config	namespacer#   )r   r   getclonedictr   
parse_args)
rE   r   r^   valuesoption_stringr0   arg_stringsr"   subnamespacerF   r#   r#   r$   __call__   s   


zActionSubCommands.__call__N)__name__
__module____qualname____doc__r   __annotations__strr   rG   r[   rg   r#   r#   r#   r$   r   e   s   
 )c                 c   s    t |  d V  d S rh   )r   set)rF   r#   r#   r$   parse_kwargs_context   s   

rp    Tcfgprefixfail_no_subcommandc           
   	      s  | j du rdS | j  t ot  }fdd jD }d j }|v rA|durA| t r@td dn*t|dkrk|sK|rk|d  |< t|dkrkt	d	d

| d| d d rt|dkrfdd|D D ]}| = q|rg}|rˈdu r|r jsdS  jrˈ jvrt j}t|dkrdd
| d }	ndd
|dd  d }	td| d|	 d| fdd|D fS )z6Returns subcommand names and corresponding subparsers.N)NNc                    s$   g | ]}t  | tr|qS r#   )r   r_   r   r&   k)rr   rs   r#   r$   r)      s   $ z#get_subcommands.<locals>.<listcomp>z:A specific subcommand can't be provided in defaults, got ''r   r	   z'Multiple subcommand settings provided (z, z) without an explicit 'z' key. Subcommand 'z' will be used.c                    s   g | ]}| kr|qS r#   r#   ru   )r0   r#   r$   r)             {,}z, ...}z
expected "z" to be one of z, but it was not provided.c                    s   g | ]} j |qS r#   )r   r_   )r&   s)r!   r#   r$   r)      rx   )_subcommands_actionr   r_   r   choicesr   r   r;   warningswarnr<   	_requiredr   list)
r   rr   rs   rt   require_singlesubcommand_keysr   r   available_subcommandscandidate_subcommands_strr#   )r!   rr   rs   r0   r$   get_subcommands   sJ   


r   c                 C   s6   t | |||d\}}|r|d nd|r|d fS dfS )z=Returns a single subcommand name and corresponding subparser.rs   rt   r   N)r   )r   rr   rs   rt   subcommands
subparsersr#   r#   r$   get_subcommand   s   
"r   envdefaultsc              	   C   s   t | |||d\}}|r|sdS t||D ]>\}}	d}
|| }|r)|	j|dd}
n|r1|	jdd}
|
durB|	||t |
||< |	jdurSt|	||||d |d qdS )z(Takes care of parsing subcommand values.r   NT)r   r\   )skip_validationr   )rt   )	r   zip	parse_envget_defaultsmerge_configr_   r   rK   handle_subcommands)r   rr   r   r   rs   rt   r   r   r0   r"   rf   r   r#   r#   r$   r      s    

r   rh   )rq   T)-rl   r   argparser   ArgparseActionr   
contextlibr   contextvarsr   typingr   r   r   r   r
   _commonr   r   
_namespacer   r   r   r   _type_checkingr   r   __all__r   rm   rn   boolr   typetupler,   r7   r?   r@   r   rp   r   r   r   r   r#   r#   r#   r$   <module>   s    

)



C

;
