o
    NK&hA&                     @   s   d dl Z d dl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 d dlmZ d d	lmZmZ d d
l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 d dl m!Z! d dl"m#Z# G dd dZ$dS )    N)	Namespace)partial)indent)Union)Sanic)get_logo)Group)SanicArgumentParserSanicHelpFormatter)	SanicREPL)Executormake_executor_parser)make_inspector_parser)InspectorClient)_defaultis_atty)error_logger)	AppLoaderc                   @   s   e Zd Zeded dddZddd	Zd
d ZdddZdd Z	de
defddZde
fddZdd ZdefddZdd ZdS )SanicCLI
Ta  

To start running a Sanic application, provide a path to the module, where
app is a Sanic() instance in the global scope:

    $ sanic path.to.server:app

If the Sanic instance variable is called 'app', you can leave off the last
part, and only provide a path to the module where the instance is:

    $ sanic path.to.server

Or, a path to a callable that returns a Sanic() instance:

    $ sanic path.to.factory:create_app

Or, a path to a directory to run as a simple HTTP server:

    $ sanic ./path/to/static
 )prefixreturnNc                    sd   t  j td| j fddd| _d| jj_d| jj_t	j
ddd	k| _t | _g | _d
| _d S )Nsanicc                    s   t |  dkrdnddd dS )N`   $         )max_help_positionindent_incrementwidth)r
   )progr     @/var/www/html/venv/lib/python3.10/site-packages/sanic/cli/app.py<lambda>6   s    z#SanicCLI.__init__.<locals>.<lambda>)r!   descriptionformatter_classzRequired
========
  PositionalzOptional
========
  GeneralSANIC_RELOADER_PROCESS trueserve)shutilget_terminal_sizecolumnsr	   DESCRIPTIONparser_positionalstitle
_optionalsosenvirongetmain_processr   argsgroupsrun_modeselfr#   r"   r$   __init__1   s   





zSanicCLI.__init__c                 C   s   t tjdkrtjd dkrd| _td| j_t| j d S tj	D ]}|
| j}|  | j| q!t tjdkrRtjd dkrTd| _td| j_t| j d S d S d S )N   inspectT   exec)lensysargvr:   r   r0   r&   r   r   	_registrycreateattachr9   appendr   )r<   groupinstancer#   r#   r$   rG   F   s   

zSanicCLI.attachc              
   C   s  | j dkr|   d S d}|s%ttjdkotjd dk}|r"dgnd }n|dgkr-dg}|se| j dkrBdd	 |p?tjd
d  D }| jj|d\}}|re|jre|D ]}|drd| j	|
dd  qR| j dkru| jj|d\| _}n| jj|d| _|   t| jj| jj| jj| j}z| |}|  }	W n ty }
 ztd|
  W Y d }
~
d S d }
~
ww | j dkr| ||	 d S | j dkrtd| j  | jjr| | | jjD ]}|jdi |	d|i q| jjrtj}nttj|d}|| d S )Nr?   Fr@   z-vz	--versionrA   c                 S   s   g | ]
}|d   vr|qS )z	-h --help)split).0ar#   r#   r$   
<listcomp>f   s
    z SanicCLI.run.<locals>.<listcomp>r>   r8   --=r   zFailed to run app: r+   zUnknown run mode: version)
app_loaderr#   ) r:   
_inspectorrB   rC   rD   r0   parse_known_argsfactory
startswithadd_argumentrL   r8   
parse_args	_precheckr   targetsimple_get_app_build_run_kwargs
ValueErrorr   	exception	_executorrepl_replhttppreparesingler   serve_singler   r+   )r<   rZ   legacy_versionparsedunknownarg_rT   appkwargsehttp_versionr+   r#   r#   r$   runW   s^   









zSanicCLI.runc              	   C   sN  t jdd  }| jj|d\| _}|rR|D ]<}|drQz|d\}}|d}W n tyI   |dr8dnd}|	dd	d	dd
}Y nw t
| j|| qi | jj}|d}|d}|d}	|d}
|dprd}|d}|dd }|dkr|r|d }t|dkr|dd  |d< t|||	|
|j|fi | d S )Nr@   rP   rQ   rR   -z--no-FTr)   rm   hostportsecurerawactioninfoapi_key
positionalz<custom>r   r>   r8   )rC   rD   r0   rV   r8   rX   rL   lstripr`   replacesetattr__dict__poprB   r   do)r<   r8   rk   rl   keyvaluero   rt   ru   rv   rw   rx   rz   r{   r#   r#   r$   rU      s<   






"zSanicCLI._inspectorrn   ro   c                 C   s(   t jdd  }t||| jj| d S )N   )rC   rD   r   rr   r8   command)r<   rn   ro   r8   r#   r#   r$   rb      s   zSanicCLI._executorc                    s:   t  r|j fdd}d S  jjdu rtd d S d S )Nc                    s&   t |  jj  |  I d H  d S N)r   r8   rc   rr   _startup)rn   r;   r#   r$   
start_repl   s   z"SanicCLI._repl.<locals>.start_replTzPCan't start REPL in non-interactive mode. You can only run with --repl in a TTY.)r   main_process_readyr8   rc   r   error)r<   rn   r   r#   r;   r$   rd      s   zSanicCLI._replc                 C   s   | j r8t| jjt| jjks#| jjr| jjs#| jjr:| jjs<| jjs>| jt	j
 d}t| t	d d S d S d S d S d S )NzTLS certificates must be specified by either of:
  --cert certdir/fullchain.pem --key certdir/privkey.pem
  --tls certdir  (equivalent to the above)r>   )r7   boolr8   certr   tlstlshostr0   print_usagerC   stderrr   r   exit)r<   messager#   r#   r$   r[      s&   	
zSanicCLI._precheckrT   c              
   C   sz   z|  }W |S  ty< } z)|j|jr/td|j d td|j  t	d n|W Y d }~|S d }~ww )NzNo module named za found.
  Example File: project/sanic_server.py -> app
  Example Module: project.sanic_server.appz2
The error below might have caused the above one:
r>   )
loadImportErrormodule_namerX   namer   r   msgrC   r   )r<   rT   rn   rp   r#   r#   r$   r^      s&   

zSanicCLI._get_appc                 C   sZ  | j D ]}|| j qg }| jjr|d  | jjd us#| jjd ur0|t| jj| jjd | jjr:|| jj7 }|s?d }nt	|dkrO|d d urO|d }| jj
| jj| jj| jj| jj| jj| jj| jj|| jj| jjppd| jj| jj| jjd}dD ]}t| j|drd||< q~| jjrtdd	 d
D rt| j_| jjrd|d< | jj|d< |S )N)r   r   r>   r   )
access_logcoffeedebugfastrt   motdnoisy_exceptionsru   sslunix	verbosityworkersauto_tlssingle_process)auto_reloaddevFTc                 s   s    | ]}|t jvV  qd S r   )rC   rD   )rM   rl   r#   r#   r$   	<genexpr>  s    

z-SanicCLI._build_run_kwargs.<locals>.<genexpr>)z--replz	--no-replr   
reload_dir)r9   rf   r8   r   rH   r   r   dictr   rB   r   r   r   r   rt   r   r   ru   r   r   r   r   rg   getattrr   allr   rc   path)r<   rI   r   ro   	maybe_argr#   r#   r$   r_      sP   


zSanicCLI._build_run_kwargs)r   Nr   )__name__
__module____qualname__r   r   r/   r=   rG   rr   rU   r   r   rb   rd   r[   r   r^   r_   r#   r#   r#   r$   r      s     

9 r   )%r4   r,   rC   argparser   	functoolsr   textwrapr   typingr   	sanic.appr   sanic.application.logor   sanic.cli.argumentsr   sanic.cli.baser	   r
   sanic.cli.consoler   sanic.cli.executorr   r   sanic.cli.inspectorr   sanic.cli.inspector_clientr   sanic.helpersr   r   	sanic.logr   sanic.worker.loaderr   r   r#   r#   r#   r$   <module>   s&    