o
    i>                  
   @   s   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 d dl	m
Z
mZmZmZmZmZmZ d dlZd dlmZmZ ejdkrFd dl	mZ nd dlmZ d dlZd dlmZ d d	lmZmZmZmZm Z m!Z!m"Z" d d
l#m$Z$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z.m/Z/ e0ee1 ee1 ej2je1 e3e1 ee1 e4e1df ee1df hZ5edZ6e0e1degee5Z7dd Z8de4e9df fddZ:e.de,G dd dZ;dd e;j<D Z=e; Z>defddZ?de6de4e6e3e; f fdd Z@eG d!d" d"ZAdS )#    N)CallableIterableSequence)deepcopy)AnyListTupleTypeVarcastget_args
get_origin)definefield)      )Self)ITERABLE_TYPES)NoneTypeis_annotatedis_nonetypeis_unionresolveresolve_annotatedresolve_optional)get_field_infossignature_parameters)Group)Token)default_name_transformfrozenoptional_to_tuple_converterrecord_initto_tuple_converter.Tc                 C   s0   |D ]}|d ur| drt|j dqd S )N-z value must NOT start with "-".)
startswith
ValueErroralias)instance	attributevaluesvalue r,   X/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/parameter.py_not_hyphen_validator@   s
   r.   defaultc                    s   dt tdf f fdd}|S )Nreturn.c                    s   | d u r S t | S N)r"   )r+   r/   r,   r-   	converterG   s   z&_negative_converter.<locals>.converter)tuplestrr/   r3   r,   r2   r-   _negative_converterF   s   r7   _provided_argsc                	   @   s  e Zd ZU dZeddd dZdeB ee B ed< edddZ	e
eee gef dB ed	< ed
dd ddZde
eegef B ee
eegef  B ed< eddd ddZdeB ee B ed< ededdZdeB ee B ed< ededddZdeB eB eeeB  B ed< edejdddZeed< eddddZedB ed< edddZdeB e
egef B ed< edejdddZeed< edddZedB ed< edejdddZeed< eddd ddZ deB ee B ed< ee!j"j#ddZ#e
ed< ede$de%dd Z&deB ee B ed!< ede$d"e%dd Z'deB ee B ed#< ede$d
e%dd Z(deB ee B ed$< edddZ)edB ed%< edddZ*eed&< ed'ddd(Z+e
egef dB ed)< edddZ,edB ed*< edejdddZ-eed+< edddZ.edB ed,< edddZ/edB ed-< edejdddZ0eed.< ee1ddd/Z2e1ed0f ed1< e3d2efd3d4Z4e3d5d6 Z5d2e1ed0f fd7d8Z6d9d: Z7e8dHd=d>Z9e8d2e:fd?d@Z;e8dAedBd<d2e1ed f fdCdDZ<dEe=d2e=fdFdGZ>dS )I	Parametera  Cyclopts configuration for individual function parameters with :obj:`~typing.Annotated`.

    Example usage:

    .. code-block:: python

        from cyclopts import app, Parameter
        from typing import Annotated

        app = App()


        @app.default
        def main(foo: Annotated[int, Parameter(name="bar")]):
            print(foo)


        app()

    .. code-block:: console

        $ my-script 100
        100

        $ my-script --bar 100
        100
    Nc                 C      t ttdf t| S N.r
   r4   r5   r"   xr,   r,   r-   <lambda>u       zParameter.<lambda>r6   nameT)r/   kw_onlyr3   r,   c                 C   s"   t ttttgtf df t| S r;   )r
   r4   r   r   r"   r=   r,   r,   r-   r?      s   " )r/   r3   rB   	validatorc                 C   r:   r;   r<   r=   r,   r,   r-   r?      r@   r'   negativeF)r/   r3   rB   hashgroupparseshow)r/   r'   rB   _showshow_defaultshow_choiceshelpshow_env_varc                 C   r:   r;   r<   r=   r,   r,   r-   r?      r@   env_varenv_var_split)zno-)r/   r3   rC   rB   negative_bool)zempty-negative_iterablenegative_nonerequiredallow_leading_hyphenname_transform)r'   r/   rB   _name_transformaccepts_keysconsume_multiple	json_dict	json_listcount)factoryiniteq.r8   r0   c                 C   s   | j d ur| j S | jS r1   )rI   rG   selfr,   r,   r-   rH     s   zParameter.showc                 C   s   | j r| j S tS r1   )rV   r   r_   r,   r,   r-   rU   	  s   zParameter.name_transformc              	   C   s  | j r
| jd u r
dS t|}t|r:t|}t|dd d}g }|D ]}| |D ]}||vr4|| q)q"t|S t	|}|t
vrM|rK|t
vrJdS ndS g g }}| jrm| jD ]}	|	dra|n||	 qX|smt|S t| jtsuJ | jD ]n}
|
dsqx|
dd  }
|
d}|tu s|tv r| j}nt|s|d u r| j}n| j}d|d d	 }|r|d7 }t|tsJ | jd u r|D ]}|r|d| | |d	   qqx|D ]}	|d| |	  qqxt|S )
Nr,   c                 S   s   t | p| d u S r1   )r   r=   r,   r,   r-   r?     s    z)Parameter.get_negatives.<locals>.<lambda>)keyr$   z--   .)r[   rD   r   r   r   sortedget_negativesappendr4   r   _NEGATIVE_FLAG_TYPESr%   
isinstancerA   splitboolITERATIVE_BOOL_IMPLICIT_VALUErP   r   rR   rQ   join)r`   type_
union_argssorted_argsoutr>   negoriginuser_negativesrD   rA   name_componentsnegative_prefixesname_prefixnegative_prefixr,   r,   r-   rf     sh   






zParameter.get_negativesc                    s0   d  fdd jD }t j d| dS )zOnly shows non-default values.z, c                    s0   g | ]}|j  jv r|j  d t |jqS )=)r'   r8   getattrrA   .0ar_   r,   r-   
<listcomp>M  s
    z&Parameter.__repr__.<locals>.<listcomp>())rm   __attrs_attrs__type__name__)r`   contentr,   r_   r-   __repr__J  s   
zParameter.__repr__
parametersParameter | Nonec                 G   sd   i }dd |D }t |dkr|d S |stS |D ]}|jD ]}t|t| ||< qq| di |S )a)  Returns a new Parameter with combined values of all provided ``parameters``.

        Parameters
        ----------
        *parameters : Parameter | None
             Parameters who's attributes override ``self`` attributes.
             Ordered from least-to-highest attribute priority.
        c                 S   s   g | ]}|d ur|qS r1   r,   r|   r>   r,   r,   r-   r~   `  s    z%Parameter.combine.<locals>.<listcomp>   r   Nr,   )lenEMPTY_PARAMETERr8   rz   _parameter_alias_to_name)clsr   kwargsfiltered	parameterr'   r,   r,   r-   combineU  s   

zParameter.combinec                 C   s   | di dd | j D S )zCreate a Parameter with all Cyclopts-default values.

        This is different than just :class:`Parameter` because the default
        values will be recorded and override all upstream parameter values.
        c                 S      i | ]
}|j r|j|jqS r,   )r]   r'   r/   r{   r,   r,   r-   
<dictcomp>v  s    z%Parameter.default.<locals>.<dictcomp>Nr,   )r   )r   r,   r,   r-   r/   n  s   zParameter.defaultrn   default_parametersc                 G   sJ   |t jju r|r|| j| fS |tfS t|\}}|| jg ||R  fS )z1Resolve the immediate Parameter from a type hint.)inspectr9   emptyr   r   get_parameters)r   rn   r   r   r,   r,   r-   from_annotationy  s   zParameter.from_annotationobjc                 C   sB   t |dst|d|_n|jj|krt|j|_|jj|  |S )zDecorator interface for annotating a function/class with a :class:`Parameter`.

        Most commonly used for directly configuring a class:

        .. code-block:: python

            @Parameter(...)
            class Foo: ...
        __cyclopts__)r   )hasattrCycloptsConfigr   r   r   r   rg   )r`   r   r,   r,   r-   __call__  s   

zParameter.__call__)r   r   r0   r9   )?r   
__module____qualname____doc__r   rA   r5   r   __annotations__r3   r   r   r   r   r   rC   r'   r    rD   r"   rF   r   attrs
convertersdefault_if_nonerG   rk   rI   rJ   rK   rL   rM   rN   cyclopts_env_varrO   r7   r.   rP   rQ   rR   rS   rT   rV   rW   rX   rY   rZ   r[   r4   r8   propertyrH   rU   rf   r   classmethodr   r   r/   r   r#   r   r,   r,   r,   r-   r9   P   s   
  "2"
 




=
 r9   c                 C   r   r,   )r]   r'   rA   )r|   pr,   r,   r-   r     s    r   fc           
      C   s<  | j pddr
dS t|  D ]}t|j}|s!t|jdds!qt|j\}}|j	s6|j
|jur6tdd|jv r|j|ju r|j}t|}t|}tdd | D }|r|jra|jd	 nd}|rkd
| dnd}	td|	 d|  d| d|jj d|jj d| d|jj d| d| d| d|jj dqdS )zValidate if a function abides by Cyclopts's rules.

    Raises
    ------
    ValueError
        Function has naming or parameter/signature inconsistencies.
     r   Nr   zJParameter.parse=False must be used with a KEYWORD_ONLY function parameter.*c                 s   s    | ]}|j  V  qd S r1   )rS   )r|   
field_infor,   r,   r-   	<genexpr>  s    z#validate_command.<locals>.<genexpr>r   "z" z
Parameter zin function z has all optional values, uses Parameter(name="*"), but itself has no default value. Consider either:
    1) If immutable, providing a default value "z: z = z2()"
    2) Otherwise, declaring it optional like "z# | None = None" and instanting the z, object in the function body:
           if z is None:
               z())r   r%   r   r*   r   
annotationrz   r9   r   rG   kindKEYWORD_ONLYr&   rA   r/   r   r   r   allnamesr   )
r   r   field_info_is_annotated_cparam	annotatedclass_field_infosall_fields_optional
param_namequoted_param_namer,   r,   r-   validate_command  sR   

r   hintr0   c                 C   sd   g }t | } t| dd }r||j t| r.t| }|d } |dd |dd D  | |fS )a  At root level, checks for cyclopts.Parameter annotations.

    Includes checking the ``__cyclopts__`` attribute.

    Returns
    -------
    hint
        Annotation hint with :obj:`Annotated` and :obj:`Optional` resolved.
    list[Parameter]
        List of parameters discovered.
    r   Nr   c                 s   s    | ]
}t |tr|V  qd S r1   )ri   r9   r   r,   r,   r-   r     s    z!get_parameters.<locals>.<genexpr>r   )r   rz   extendr   r   r   )r   r   cyclopts_configinnerr,   r,   r-   r     s   r   c                   @   s6   e Zd ZU dZdZeed< eeddZ	ee
 ed< dS )r   z^
    Intended for storing additional data to a ``__cyclopts__`` attribute via decoration.
    Nr   F)r\   r]   r   )r   r   r   r   r   r   r   r   listr   r9   r,   r,   r,   r-   r     s   
 r   )Bcollections.abccollectionsr   sysr   r   r   copyr   typingr   r   r   r	   r
   r   r   r   r   r   version_infor   typing_extensionscyclopts._env_varr   cyclopts._convertr   cyclopts.annotationsr   r   r   r   r   r   r   cyclopts.field_infor   r   cyclopts.groupr   cyclopts.tokenr   cyclopts.utilsr   r   r    r!   r"   	frozensetrk   abcr   r4   rl   r#   rh   r.   r5   r7   r9   r   r   r   r   r   r   r,   r,   r,   r-   <module>   sZ    $

$	



  H0