o
    i#                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlm	Z	 e	r$ddl
mZ ddlmZ edd	 Zd
eeB dedef fddZdS )z.Load Cyclopts App objects from Python scripts.    N)contextmanager)Path)TYPE_CHECKINGApp)CommandSpecc                  c   s>    ddl m}  | j}dd }z|| _dV  W || _dS || _w )zTemporarily disable App.__call__ to prevent execution during module loading.

    This context manager replaces App.__call__ with a no-op function, allowing
    scripts that call app() at module level to be imported without executing.
    r   r   c                 _   s   dS )z9No-op replacement for App.__call__ during module loading.N )selfargskwargsr   r   U/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/cyclopts/loader.py_dummy_call   s   z,_suppress_app_execution.<locals>._dummy_callN)cycloptsr   __call__)r   original_callr   r   r   r   _suppress_app_execution   s   r   scriptreturnr   c                    s  ddl m} d}t| }d|v r1|dd\}  r,t fdddD s, }t|}n	t| }nt| }| }| sMtd	| d
t	j
d t	d |jdksbtd| dt	j
d t	d tjd|}|du sr|jdu rtd| dt	j
d t	d tj|}|t	jd< t  |j| W d   n1 sw   Y  |rt||std| d| dt	j
d t	d t||}t||std| dt	j
d t	d ||fS g }	t|D ]}
|
dst||
}t||r|	|
|f q|	std| dt	j
d t	d t|	dkrrg |	D ]\}}t|dr2dd |j D  qfdd|	D }|rB|}	t|	dkrrddd |	D }t| tr]t| n| }td| d| dt	j
d t	d |	d \}
}||
fS ) aG  Load a Cyclopts App object from a Python script.

    Parameters
    ----------
    script : str | Path
        Python script path, optionally with ``':app_object'`` notation to specify
        the :class:`App` object. If not specified, will search for :class:`App`
        objects in the script's global namespace.

    Returns
    -------
    tuple[App, str]
        The loaded :class:`App` object and its name.

    Raises
    ------
    SystemExit
        If the script cannot be loaded, no App objects are found, or multiple
        App objects exist without specification.
    r   r   N:   c                 3   s    | ]}| v V  qd S Nr   ).0sep)potential_app_namer   r   	<genexpr>E       z'load_app_from_script.<locals>.<genexpr>)/\zError: Script 'z' not found.)filez.pyzError: 'z' is not a Python file.__cyclopts_doc_modulez#Error: Could not load module from 'z'.zError: No object named 'z' found in 'z' is not a Cyclopts App object._z)Error: No Cyclopts App objects found in '	_commandsc                 s   s    | ]
}t |ts|V  qd S r   )
isinstancer   )r   cmdr   r   r   r      s    c                    s    g | ]\}}| vr||fqS r   r   )r   nameapp)registered_appsr   r   
<listcomp>   s     z(load_app_from_script.<locals>.<listcomp>z, c                 s   s    | ]\}}|V  qd S r   r   )r   r$   r    r   r   r   r      r   z#Error: Multiple App objects found: z. Please specify one using 'z:app_name'.) r   r   strrsplitanyr   resolveexistsprintsysstderrexitsuffix	importlibutilspec_from_file_locationloadermodule_from_specmodulesr   exec_modulehasattrgetattrr"   dir
startswithappendlenextendr!   valuesjoin)r   r   app_name
script_strscript_path_strscript_pathspecmoduleapp_objapp_objectsr$   objr    r%   filtered_appsnamesr   )r   r&   r   load_app_from_script%   s   
















rM   )__doc__importlib.utilr2   r.   
contextlibr   pathlibr   typingr   r   r   cyclopts.command_specr   r   r(   tuplerM   r   r   r   r   <module>   s    
"