o
    ii                     @   sz  d Z ddlZddlZddlZddlmZmZmZ ddlm	Z	m
Z
mZmZmZ e	r.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 ddlmZmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% edZ&G dd de'e Z(ddddede
f dedB dedB dedB de'e f
ddZ)ded de(fddZ*	d&de+d e,d!e(ded dB d"ee, d#e-fd$d%Z.dS )'z3ArgumentCollection class and related functionality.    N)CallableIterableSequence)TYPE_CHECKINGAnySupportsIndexTypeVaroverload)App)UnknownOptionError)signature_parameters)Group)	Parameter)Token)UNSETis_iterable   )Argument)KIND_PARENT_CHILD_REASSIGNMENTPARAMETER_SUBKEY_BLOCKERextract_docstring_helpresolve_parameter_nameto_cli_option_namewalk_leavesTc                       s   e Zd ZdZ fddZdDddZededefdd	Z	ede
dee fd
d	Z	ededefdd	Z	deeB e
B deee B f fdd	Z	dedef fddZe	dEddddeeB dee deegef dB dedef
ddZeddddeeB dedeegef dB dedeeB f
ddZefddddeeB dedeegef dB dedeeB f
ddZddddeeB deegef dB dedeeeedf ef fddZdefddZd d! Zed"ddd"d#d$eedf d%edB d&eeef d'ed(ed)ed*eeedf ef dB d+edB d,efd-d.Zedddd"d"d/d0ed%edB d&eeef dB d'edB d(edB d)ed,efd1d2Z e!d3d4 Z"e!d5d6 Z#e!dedB fd7d8Z$ddddddddd9d:edB d;edB d<edB d=eedf dB d>e%j&dB d?edB d@edB dAedB dd fdBdCZ'  Z(S )FArgumentCollectionz,A list-like container for :class:`Argument`.c                    s   t  j|  d S N)super__init__)selfargs	__class__ c/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/argument/_collection.pyr   '   s   zArgumentCollection.__init__returnc                 C   s   t | | S )z:Returns a shallow copy of the :class:`ArgumentCollection`.)typer   r#   r#   r$   copy*   s   zArgumentCollection.copytermc                C      d S r   r#   r   r)   r#   r#   r$   __getitem__.      zArgumentCollection.__getitem__c                C   r*   r   r#   r+   r#   r#   r$   r,   0   r-   c                C   r*   r   r#   r+   r#   r#   r$   r,   2   r-   c                    s$   t |ttfrt |S | |S r   )
isinstancer   slicer   r,   getr+   r!   r#   r$   r,   4   s   
itemc                   s:   t |trz| |  W dS  ty   Y dS w t |S )a  Check if an argument or argument name exists in the collection.

        Parameters
        ----------
        item : Argument | str
            Either an Argument object or a string name/alias to search for.

        Returns
        -------
        bool
            True if the item is in the collection.

        Examples
        --------
        >>> argument_collection = ArgumentCollection(
        ...     [
        ...         Argument(parameter=Parameter(name="--foo")),
        ...         Argument(parameter=Parameter(name=("--bar", "-b"))),
        ...     ]
        ... )
        >>> "--foo" in argument_collection
        True
        >>> "-b" in argument_collection  # Alias matching
        True
        >>> "--baz" in argument_collection
        False
        TF)r.   strKeyErrorr   __contains__)r   r1   r!   r#   r$   r4   =   s   
zArgumentCollection.__contains__.N.	transform	delimiterdefaultr7   r8   c                C   r*   r   r#   r   r)   r9   r7   r8   r#   r#   r$   r0   b      zArgumentCollection.getc                C   r*   r   r#   r:   r#   r#   r$   r0   k   r;   c                C   sh   z| j |||d\}}}|W S  ty3   |tu r/t|tr&td| dtd| dd| Y S w )a  Get an :class:`Argument` by name or index.

        This is a convenience wrapper around :meth:`match` that returns just
        the :class:`Argument` object instead of a tuple.

        Parameters
        ----------
        term : str | int
            Either a string keyword or an integer positional index.
        default : Any
            Default value to return if term not found. If :data:`~cyclopts.utils.UNSET` (default),
            will raise :exc:`KeyError`/:exc:`IndexError`.
        transform : Callable[[str], str] | None
            Optional function to transform string terms before matching.
        delimiter : str
            Delimiter for nested field access.

        Returns
        -------
        Argument | None
            The matched :class:`Argument`, or ``default`` if provided and not found.

        Raises
        ------
        :exc:`KeyError`
            If ``term`` is a string and not found (when ``default`` is :data:`~cyclopts.utils.UNSET`).
        :exc:`IndexError`
            If ``term`` is an int and is out-of-range (when ``default`` is :data:`~cyclopts.utils.UNSET`).

        See Also
        --------
        :meth:`match` : Returns a tuple of (:class:`Argument`, keys, value) with more detailed information.
        r6   zNo such Argument: NzArgument index z out of range)match
ValueErrorr   r.   r2   r3   
IndexError)r   r)   r9   r7   r8   argument_r#   r#   r$   r0   t   s   )
c          
   	   C   s   ddt }}}| D ].}z|j|||d\}}	W n	 ty!   Y q
w |du s.t|t|k r4|}|}|	}|s8 nq
|du sA|du rHtd||||fS )a  Matches CLI keyword or index to their :class:`Argument`.

        Parameters
        ----------
        term: str | int
            One of:

            * :obj:`str` keyword like ``"--foo"`` or ``"-f"`` or ``"--foo.bar.baz"``.

            * :obj:`int` global positional index.

        Raises
        ------
        ValueError
            If the provided ``term`` doesn't match.

        Returns
        -------
        Argument
            Matched :class:`Argument`.
        tuple[str, ...]
            Python keys into :class:`Argument`. Non-empty iff :class:`Argument` accepts keys.
        Any
            Implicit value (if a flag). :obj:`~.UNSET` otherwise.
        Nr6   zNo Argument matches )r   r<   r=   len)
r   r)   r7   r8   best_match_argumentbest_match_keysbest_implicit_valuer?   
match_keysimplicit_valuer#   r#   r$   r<      s"    
zArgumentCollection.matchvalc                 C   s   | D ]}||_ qd S r   )_marked)r   rG   r?   r#   r#   r$   
_set_marks   s   zArgumentCollection._set_marksc                 C   s4   |  d t| dd dD ]
}|jrq|  qdS )z"Convert and validate all elements.Fc                 S   s   | j S r   keys)xr#   r#   r$   <lambda>   s    z-ArgumentCollection._convert.<locals>.<lambda>)keyN)rI   sortedrH   convert_and_validater   r?   r#   r#   r$   _convert   s   

zArgumentCollection._convertT)parse_docstringdocstring_lookuppositional_index_resolve_groupsrK   default_parametersgroup_lookupgroup_argumentsgroup_parametersrS   rT   rU   rV   c                   sF  ddl m} |  }|d u ri }g }|j}||\}}|| |s:|j|ju r.tt|f }n|j|ju r:t	|df }|	rg }|D ]i g } j
D ]}t|trR|| }|| ||j qG|  |rtdd |D }tdd |D }|r|t|d q@|r|j|j|jfv r|n|}|ft	| }|t|d q@|t|d q@n|}tj|j|j|jfv rt|dnt|dg|
R  }tj| }|rt|t| t tt|j|jpt	 fdd|jD  j d	 n{t|| t jt	sJ  jr#|jr"t jt	sJ t tt j j d	 nK|j|j|jfv r=t td
d |jD d	 n1|j|ju rNt tdd	 n  jd usVJ t tt	 fdd|jD t j d	 |jrtd }t| ||d}|d ur|jr|jr||_|d7 }|| |jr!|rt|jni }| | |j!" D ]s\}t#|j$j|jf }|d u rq||_|jrd }fdd|" D }| j%||f  |j&rt|j&dn|'ft|j(|j(@ d|||||||	d}|r|j)|d  || |d ur|j*}|d ur|d7 }q|S )Nr   )get_parameters.c                 s   s    | ]}|j V  qd S r   show.0gr#   r#   r$   	<genexpr>  s    z0ArgumentCollection._from_type.<locals>.<genexpr>c                 s   s    | ]}|j  V  qd S r   namer^   r#   r#   r$   ra         groupc                 3   s    | ]}  |V  qd S r   name_transformr_   rL   cparamr#   r$   ra   :  s    rb   c                 s   s    | ]}|  V  qd S r   )upperr_   rc   r#   r#   r$   ra   M  rd   )z--[KEYWORD]c                 3   s    | ]
}d   | V  qdS )z--Nrg   rm   rj   r#   r$   ra   U      )
field_info	parameterrK   hintr   c                    s6   i | ]\}}|d   krt |dkr|dd |qS r   r   N)rA   r_   kv)sub_field_namer#   r$   
<dictcomp>s  s    0z1ArgumentCollection._from_type.<locals>.<dictcomp>help)required)rX   rY   rZ   rS   rT   rU   rV   )+cyclopts.parameterr[   rq   extendkindVAR_KEYWORDdictr2   VAR_POSITIONALtuplerf   r.   appenddefault_parameteranyallr   POSITIONAL_ONLYcombiner   r   rc   namesalias
is_keywordrh   is_keyword_onlyr   _accepts_keywords_enum_flag_typeindexr   update_lookupitemsr   ro   
_from_typery   r0   rz   children
_max_index)clsro   rK   rX   rY   rZ   rS   rT   rU   rV   rW   r[   outcyclopts_parameters_no_grouprq   hint_parameterscyclopts_parametersresolved_groupsrf   has_visible_groupall_namelessdefault_group
all_groupsupstream_parameterimmediate_parameterr?   hint_docstring_lookupsub_field_infoupdated_kindsubkey_docstring_lookupsubkey_argument_collectionr#   )rk   rv   r$   r      s  






 








zArgumentCollection._from_type)rX   rY   rZ   rS   rV   funcc                   s
  |  }|d u rt  }|d u rt  }|r'dd t|g|R ||dD }ni }|r/t|ni }	d}
t| D ]I |rI fdd|	 D }nd }| j dg| j	r[t
 j	dn|	 jfR ||||
|||d}|
d ur}|j}
|
d ur}|
d	7 }
|| q9|S )
Nc                 S   s   i | ]}|j |qS r#   rb   )r_   rf   r#   r#   r$   rw     s    z5ArgumentCollection._from_callable.<locals>.<dictcomp>rY   rZ   r   c                    s8   i | ]\}}|d   j krt|dkr|dd |qS rr   )rc   rA   rs   ro   r#   r$   rw     s    2r#   rx   )rX   rY   rZ   rU   rS   rT   rV   r   )r   create_default_argumentscreate_default_parameters_resolve_groups_from_callabler   r   valuesr   r   ry   r   r0   rc   r   r|   )r   r   rX   rY   rZ   rS   rV   rW   r   rT   rU   r   iparam_argument_collectionr#   r   r$   _from_callable  s^   

z!ArgumentCollection._from_callablec                 C   sD   g }| D ]}t |jjtsJ |jjD ]}||vr|| qq|S r   )r.   rp   rf   r   r   )r   groupsr?   rf   r#   r#   r$   r     s   
zArgumentCollection.groupsc                 c   s    | D ]}|j s|V  qd S r   rJ   rQ   r#   r#   r$   _root_arguments  s   z"ArgumentCollection._root_argumentsc                 C   s   t dd | D d dS )Nc                 s   s     | ]}|j d ur|j V  qd S r   )r   ri   r#   r#   r$   ra         z0ArgumentCollection._max_index.<locals>.<genexpr>)r9   )maxr'   r#   r#   r$   r     s   zArgumentCollection._max_indexrf   
has_tokenshas_tree_tokenskeys_prefixr}   parser]   	value_setrf   r   r   r   r}   r   r]   r   c                   s  |   }	t| }
 dur|
 fdd|	D }	dur&|
fdd|	D }	dur5|
fdd|	D }	durD|
fdd|	D }	durS|
fdd|	D }	durb|
fdd|	D }	durq|
fd	d|	D }	dur|
fd
d|	D }	|	S )a  Filter the :class:`ArgumentCollection`.

        All non-None filters will be applied.

        Parameters
        ----------
        group: Group | None
            The :class:`.Group` the arguments should be in.
        has_tokens: bool | None
            Immediately has tokens (not including children).
        has_tree_tokens: bool | None
            :class:`Argument` and/or it's children have parsed tokens.
        kind: inspect._ParameterKind | None
            The :attr:`~inspect.Parameter.kind` of the argument.
        parse: bool | None
            If the argument is intended to be parsed or not.
        show: bool | None
            The :class:`Argument` is intended to be show on the help page.
        value_set: bool | None
            The converted value is set.
        Nc                 3   s     | ]} |j jv r|V  qd S r   )rp   rf   ri   re   r#   r$   ra   
  r   z/ArgumentCollection.filter_by.<locals>.<genexpr>c                 3   s     | ]}|j j kr|V  qd S r   )ro   r}   ri   )r}   r#   r$   ra     r   c                 3   &    | ]}t |jt  A s|V  qd S r   booltokensri   )r   r#   r$   ra        $ c                 3   r   r   r   ri   )r   r#   r$   ra     r   c                 3   s*    | ]}|j d t   kr|V  qd S r   )rK   rA   ri   )r   r#   r$   ra     s   ( c                 3   s"    | ]}|j t A s|V  qd S r   )r]   r   ri   r\   r#   r$   ra     s     c                 3   s&    | ]}|j tu t A r|V  qd S r   )valuer   r   ri   )r   r#   r$   ra     r   c                 3   s     | ]}|j j A s|V  qd S r   )rp   r   ri   )r   r#   r$   ra     r   )r(   r&   )r   rf   r   r   r   r}   r   r]   r   acr   r#   r   r$   	filter_by  s&   !zArgumentCollection.filter_by)r%   r   ).))__name__
__module____qualname____doc__r   r(   r	   r   r   r,   r/   listr2   objectr   r4   intr&   r   r   r0   r   r   r   r<   rI   rR   classmethodr   r   r   r   r   propertyr   r   r   inspect_ParameterKindr   __classcell__r#   r#   r!   r$   r   $   s2   


	%
8
2	

	
 .<
	
	
r   r   r   .rW   rY   rZ   r%   c             
      s:  t j| g|R ||ddd}g }|d ur|| |d ur#|| |D ]F}|jjD ]? t ts3q+t fdd|D rBtd j	d urO j	jrOtdzt
 fdd|D  W q+ tyj   |  Y q+w q%|D ],}|jjD ]% t ts|qtzt
 fdd|D  W qt ty   |t  Y qtw qn|S )	NF)rY   rZ   rS   rV   c                 3   s$    | ]} |ko|j  j kV  qd S r   _nameri   re   r#   r$   ra   7  s   " z0_resolve_groups_from_callable.<locals>.<genexpr>z8Cannot register 2 distinct Group objects with same name.z6Group.default_parameter cannot have a specified group.c                 3   s     | ]}|j  j kr|V  qd S r   r   ri   re   r#   r$   ra   >  r   c                 3   s    | ]
}|j  kr|V  qd S r   rb   ri   re   r#   r$   ra   G  rn   )r   r   r   rp   rf   r.   r   r   r=   r   nextStopIterationr2   )r   rY   rZ   rW   argument_collectionr   r?   r#   re   r$   r     sP   	



r   appsr
   c                 C   s0   t  }| D ]}|jd u rq||j  q|S r   )r   _metar|   assemble_argument_collection)r   r   appr#   r#   r$   _meta_argumentsN  s   
r   configsource	arguments	root_keysallow_unknownc                C   s|  t |pd}i }|  D ].\}}	t|	D ]$\}
}t|g|
R  }ddd t||f|
D }z|| W q tyB   Y nw d}d}z
||\}}}W ns ty   |
r|D ]e}t	|
t	|j
krhq\d}tt|
|j
ddD ]D\}\}}||krqt|t	|j
d	 kr||jjvrd} n'qt|j
d|d	  }d}|D ]}|j
|kr||jjv rd} nq|sd} nqt|r|}d} nq\Y nw |s|rq|r|d
 jrqtt||d|dd|t|t|jrqt|s|f}|r,t|D ]3\}}|du r
t|d|||d}nt|ttB rt|}nt|}t|||||d}|| qqt|||d|d}|| qqdS )a`  Updates an argument collection with values from a configuration dictionary.

    This function takes configuration data (typically from JSON, TOML, YAML files
    or environment variables) and populates the corresponding arguments in the
    ArgumentCollection with tokens representing those values.

    The function handles various naming conventions, including:
    - Exact matches (e.g., "storage_class" matches "storage_class")
    - Transformed matches (e.g., "storage-class" matches "storage_class")
    - Pydantic aliases (e.g., "storageClass" matches field with alias "storageClass")

    Parameters
    ----------
    config : dict
        Configuration dictionary with nested structure mapping to CLI arguments.
    source : str
        Source identifier (e.g., file path or "env") for error messages and tracking.
    arguments : ArgumentCollection
        Collection of arguments to populate with configuration values.
    apps : Optional[Sequence[App]]
        Stack of App instances for meta-argument handling.
        We need to know all the meta-apps leading up to the current application so that we can
        properly detect unknown keys.
    root_keys : Iterable[str]
        Base path keys to prepend to all configuration keys.
    allow_unknown : bool
        If True, ignore unrecognized configuration keys instead of raising errors.

    Raises
    ------
    UnknownOptionError
        If a configuration key doesn't match any argument and allow_unknown is False.

    Notes
    -----
    Arguments that already have tokens are skipped to preserve command-line
    precedence over configuration files.
    r#    c                 s   s    | ]	}d | dV  qdS )[]Nr#   )r_   rt   r#   r#   r$   ra     s    z-update_argument_collection.<locals>.<genexpr>NTF)strictr   )keywordr   )tokenr   )r   rF   r   r   rK   )r   r   r   r   rK   r   )r   r   r   r   join	itertoolschainr<   r=   rA   rK   	enumeratezipro   r   _meta_parentr   r   
setdefaultidr   r   r   r.   r   r   jsondumpsr2   r   )r   r   r   r   r   r   meta_argumentsdo_not_update
option_keyoption_valuesubkeysr   cli_option_namecomplete_keywordr?   remaining_keysr@   arg	all_matchisubkeyarg_keyparent_keysalias_found
parent_argru   r   	value_strr#   r#   r$   update_argument_collectionW  s   / 
 


r   r   )/r   r   r   r   collections.abcr   r   r   typingr   r   r   r   r	   cyclopts.corer
   cyclopts.exceptionsr   cyclopts.field_infor   cyclopts.groupr   r{   r   cyclopts.tokenr   cyclopts.utilsr   r   	_argumentr   utilsr   r   r   r   r   r   r   r   r   r   r   r   r2   r   r   r#   r#   r#   r$   <module>   sb     	   

1
