o
    #1 iM                  
   @   s  d dl Z d dlZ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mZmZmZmZ d dlZd dlZd dl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 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)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2m3Z3m4Z4 e5e6Z7de
de8fddZ9de
de:fddZ;de
de
de
fddZ<G dd deZ=dee= fddZ>G dd  d eZ?d!e8d"e8de?fd#d$Z@G d%d& d&e8eZAG d'd( d(eZBd)e8deBfd*d+ZCG d,d- d-eZDd.e8d/e
ddfd0d1ZEd2e8dee? fd3d4ZFd!e8dee? fd5d6ZGg d7ZHg d8ZId9ed:e
de)fd;d<ZJd9ed)e8d=eBddfd>d?ZKG d@dA dAeZLdBeLd9eddfdCdDZMd9eddfdEdFZN		GdOde!ee
df ejOdHdIf dJe!e:ejdKdLdIf defdMdNZPdS )P    N)Enum)cycle)Path)AnyDictListOptionalUnion)Client)	BaseModelEmailStrValidationError)Text)RichToolkit)Option)	Annotated)login)	APIClientBuildLogErrorTooManyRetriesError)	AppConfigget_app_configwrite_app_config)is_logged_in)get_rich_toolkithandle_http_errors)TypeAdapter
model_dumpmodel_validatepathreturnc                 C   s   | j S N)namer    r$   m/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/fastapi_cloud_cli/commands/deploy.py_get_app_name#   s   r&   c                    s4   g d}t  fdd|D rdS  jdkrdS dS )N)z.venv__pycache__z.mypy_cachez.pytest_cachez
.gitignore.fastapicloudignorec                 3   s    | ]}| j v V  qd S r!   )parts).0partr#   r$   r%   	<genexpr>2   s    z(_should_exclude_entry.<locals>.<genexpr>Tz.pycF)anysuffix)r   Zparts_to_excluder$   r#   r%   _should_exclude_entry(   s   	
r/   tar_pathc                 C   s   t d|  tj| tdgdd}t d| d}t|d(}|D ]}| r(q!|| }t d| |j	||d	 |d
7 }q!W d    n1 sIw   Y  t d| |S )Nz&Starting archive creation for path: %sr(   F)Zshould_exclude_entryZadditional_ignore_pathsZignore_hiddenzArchive will be created at: %sr   wzAdding %s to archive)arcname   z*Archive created successfully with %s files)
loggerdebugrignorewalkr/   fastaropenis_dirrelative_toappend)r   r0   filesZ
file_counttarfilenamer2   r$   r$   r%   archive;   s*   


r@   c                   @   s&   e Zd ZU eed< eed< eed< dS )Teamidslugr"   N__name__
__module____qualname__str__annotations__r$   r$   r$   r%   rA   U   s   
 rA   c                  C   sR   t  } | d}|  | d }W d    n1 sw   Y  dd |D S )Nz/teams/datac                 S      g | ]}t t|qS r$   )r   rA   r*   teamr$   r$   r%   
<listcomp>b       z_get_teams.<locals>.<listcomp>r   getraise_for_statusjson)clientresponserJ   r$   r$   r%   
_get_teams[   s   
rV   c                   @   s   e Zd ZU eed< eed< dS )AppResponserB   rC   NrD   r$   r$   r$   r%   rW   e   s   
 rW   team_idapp_namec                 C   sT   t  }|jd|| dd}|  tt| W  d    S 1 s#w   Y  d S )N/apps/)r"   rX   rS   )r   postrR   r   rW   rS   )rX   rY   rT   rU   r$   r$   r%   _create_appj   s   $r]   c                   @   sZ   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZedd defddZdS )DeploymentStatuswaiting_uploadready_for_buildbuilding
extractingextracting_failedbuilding_imagebuilding_image_failed	deployingdeploying_failed	verifyingverifying_failedverifying_skippedsuccessfailedstatusr    c                 C   s\   | j d| jd| jd| jd| jd| jd| jd| jd| jd	| j	d
| j
d| jd| jd| jdi| S )NzWaiting for uploadzReady for buildZBuildingZ
ExtractingzExtracting failedzBuilding imagezBuild failedZ	DeployingzDeploying failedZ	VerifyingzVerifying failedzVerification skippedZSuccessZFailed)r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   )clsrm   r$   r$   r%   to_human_readable   s"   z"DeploymentStatus.to_human_readableN)rE   rF   rG   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   classmethodrH   ro   r$   r$   r$   r%   r^   v   s"    r^   c                   @   s>   e Zd ZU eed< eed< eed< eed< eed< eed< dS )CreateDeploymentResponserB   app_idrC   rm   dashboard_urlurlN)rE   rF   rG   rH   rI   r^   r$   r$   r$   r%   rq      s   
 rq   rr   c                 C   sR   t  }|d|  d}|  tt| W  d    S 1 s"w   Y  d S )NrZ   /deployments/)r   r\   rR   r   rq   rS   )rr   rT   rU   r$   r$   r%   _create_deployment   s
   $rv   c                   @   s&   e Zd ZU eed< eeef ed< dS )RequestUploadResponsert   fieldsN)rE   rF   rG   rH   rI   r   r$   r$   r$   r%   rw      s   
 rw   deployment_idarchive_pathc              	   C   s*  t d|  t d|| j t x}t \}t d |d|  d}|  tt	|
 }t d|j t d |j|j|jd|d	id
}|  t d t d |d|  d}|  t d W d    n1 svw   Y  W d    d S W d    d S 1 sw   Y  d S )Nz-Starting deployment upload for deployment: %sz Archive path: %s, size: %s byteszRequesting upload URL from APIru   z/uploadzReceived upload URL: %szStarting file upload to S3filerb)rJ   r=   z"File upload completed successfullyz%Notifying API that upload is completez/upload-completez%Upload notification sent successfully)r4   r5   statst_sizer   r
   r\   rR   r   rw   rS   rt   rx   r9   )ry   rz   Zfastapi_clientrT   rU   Zupload_dataZupload_responseZnotify_responser$   r$   r%   _upload_deployment   s<   




Pr   app_slugc                 C   sl   t  &}|d|  }|jdkr	 W d    d S |  | }W d    n1 s,w   Y  tt|S )NrZ   i  )r   rQ   status_coderR   rS   r   rW   )r   rT   rU   rJ   r$   r$   r%   _get_app   s   



r   c                 C   sZ   t  }|jdd| id}|  | d }W d    n1 s!w   Y  dd |D S )NrZ   rX   )paramsrJ   c                 S   rK   r$   )r   rW   r*   appr$   r$   r%   rN      rO   z_get_apps.<locals>.<listcomp>rP   )rX   rT   rU   rJ   r$   r$   r%   	_get_apps   s   r   )
u+   🚀 Preparing for liftoff! Almost there...uA   👹 Sneaking past the dependency gremlins... Don't wake them up!u>   🤏 Squishing code into a tiny digital sandwich. Nom nom nom.u;   🐱 Removing cat videos from our servers to free up space.uM   🐢 Uploading at blazing speeds of 1 byte per hour. Patience, young padawan.uN   🔌 Connecting to server... Please stand by while we argue with the firewall.uQ   💥 Oops! We've angered the Python God. Sacrificing a rubber duck to appease it.u3   🧙 Sprinkling magic deployment dust. Abracadabra!uB   👀 Hoping that @tiangolo doesn't find out about this deployment.uF   🍪 Cookie monster detected on server. Deploying anti-cookie shields.)uS   😅 Well, that's embarrassing. We're still waiting for the deployment to finish...u9   🤔 Maybe we should have brought snacks for this wait...u   🥱 Yawn... Still waiting...uK   🤯 Time is relative... Especially when you're waiting for a deployment...toolkitpath_to_deployc           
   	   C   s  | j d| dddstd|   | d!}t|dd t }W d    n1 s.w   Y  W d    n1 s=w   Y  |   | jd	d
dd |D d}|   | j dddd}|   |s| d#}t|dd t|j	}W d    n1 sw   Y  W d    n1 sw   Y  |   |s| 
d td| jddd |D d}nF| jdt|d}|   | jdd+}t| t|j	|}W d    n1 sw   Y  |d|j  W d    n1 sw   Y  t|j	|j	d}	t||	 |	S )NzSetup and deploy [blue]z[/]?dirtagr   zFetching teams...z-Error fetching teams. Please try again later.)messagez&Select the team you want to deploy to:rM   c                 S      g | ]
}t |j|d qS r"   value)r   r"   rL   r$   r$   r%   rN         z"_configure_app.<locals>.<listcomp>r   optionsz Do you want to create a new app?r   T)r   defaultzFetching apps...z,Error fetching apps. Please try again later.z=No apps found in this team. You can create a new app instead.r3   z%Select the app you want to deploy to:c                 S   r   r   )r   rC   r   r$   r$   r%   rN   4  r   )r   zWhat's your app name?)titler   zCreating app...r   z$App created successfully! App slug: )rr   rX   )confirmtyperExit
print_lineprogressr   rV   askr   rB   printinputr&   r]   logrC   r   r   )
r   r   r   ZteamsrM   Zcreate_new_appZappsr   rY   
app_configr$   r$   r%   _configure_app  sn   



r   
deploymentc                 C   s*  t t}| jddd |   | d|j d|j d |   d}t }t }| jt|dd	d
}t	 }z|
|jD ]{}	t | }|	jdkrY|t|	j  |	jdkr|d |d|j d|j d |d |d|j d|j d  n7|	jdkr|d |d|j d|j d td|dkrt t}t | dkrt||_t }qAW n, ttfy }
 ztd|
 |   | d|j d|j d td|
d }
~
ww W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nu+   Checking the status of your deployment 👀cloudr   z'You can also check the status at [link=][/link]g        T   )Zinline_logsZlines_to_showr   Zcomplete u3   🐔 Ready the chicken! Your app is ready at [link=z)You can also check the app logs at [link=rl   u>   😔 Oh no! Something went wrong. Check out the logs at [link=r3         zBuild log streaming failed: %suK   ⚠️  Unable to stream build logs. Check the dashboard for status: [link=)r   WAITING_MESSAGESr   r   rs   time	monotonicr   nextr   Zstream_build_logsrB   typer   r   	from_ansir   rstriprt   r   r   LONG_WAIT_MESSAGESr   r   r   r4   error)r   rr   r   messagesZtime_elapsedZ
started_atZlast_message_changed_atr   rT   r   er$   r$   r%   _wait_for_deploymentK  sr   








Rr   c                   @   s   e Zd ZU eed< dZee ed< dZee ed< dZ	ee ed< dZ
ee ed< dZee ed< dZee ed< dZee ed	< dS )
SignupToWaitingListemailNr"   organizationrole	team_sizelocationuse_casesecret_code)rE   rF   rG   r   rI   r"   r   rH   r   r   r   r   r   r   r$   r$   r$   r%   r     s   
 r   resultc              
   C   s   | dB}t )}t| |jdt| d}|  W d    n1 s&w   Y  W d    n1 s5w   Y  |d W d    d S 1 sJw   Y  d S )NzSending your request...z/users/waiting-listr[   u9   Let's go! Thanks for your interest in FastAPI Cloud! 🚀)r   r   r   r\   r   rR   r   )r   r   r   rT   rU   r$   r$   r%   _send_waitlist_form  s   

"r   c                 C   s  ddl m} | jddd |   | jddttd}|   ttd	|i}| j	d
ddr|   |d| j
d}|jdddd |jdddd |jdddd |jdddd |jdddd |jdddd |jd d!d"d | }zttd	|i|}W n ty   | d# Y d S w |   | j	d$d%dr|   t||  tt tjg d&tjtjd'd( W d    d S 1 sw   Y  d S d S ))Nr   )FormzkWe're currently in private beta. If you want to be notified when we launch, please fill out the form below.waitlistr   zEnter your email:T)required	validatorr   z?Do you want to get access faster by giving us more information?zWaitlist form)styler"   NamezJohn Doe)labelplaceholderr   ZOrganizationz	Acme Inc.rM   rA   zTeam Ar   ZRoleZ	Developerr   ZLocationzSan Franciscor   z%How do you plan to use FastAPI Cloud?zI'm building a web appr   zSecret codeZ123456z.[error]Invalid form data. Please try again.[/]zDo you agree to
- Terms of Service: [link=https://fastapicloud.com/legal/terms]https://fastapicloud.com/legal/terms[/link]
- Privacy Policy: [link=https://fastapicloud.com/legal/privacy-policy]https://fastapicloud.com/legal/privacy-policy[/link]
Zterms)r9   z-gu!   raycast://confetti?emojis=🐔⚡F)stdoutstderrcheck)Zrich_toolkit.formr   r   r   r   r   r   r   r   r   r   Z	add_inputrunr   r   
contextlibsuppress	Exception
subprocessDEVNULL)r   r   r   r   formr$   r$   r%   _waitlist_form  s   "r   Fz:A path to the folder containing the app you want to deploy)help	skip_waitz	--no-waitz"Skip waiting for deployment statusc                 C   sJ  t d t d| | t }t sXt d |jddd |  |jddd |  |jd	d
tdddtdddgd}|  |dkrOt	  n	t
| td|jddd |  | pht }t d| t|}|st d t||d}|  nt d |d |  |jddd4}t| t d|j t|j}W d   n1 sw   Y  |st d |d W d   n1 sw   Y  |s|  |jdd d tdt m}t d! t|d" }	t| pt |	 |jd#d$B}t|- t d%|j t|j}
|d&|
j  |d' t|
j|	 |d( W d   n	1 s=w   Y  W d   n	1 sMw   Y  W d   n	1 s]w   Y  |  |swt d) t||j|
d* nt d+ |d,|
j d-|
j d. W d   dS W d   dS 1 sw   Y  dS )/uB   
    Deploy a [bold]FastAPI[/bold] app to FastAPI Cloud. 🚀
    zDeploy command startedzDeploy path: %s, skip_wait: %sz3User not logged in, prompting for login or waitlistzWelcome to FastAPI Cloud!ZFastAPIr   z4You need to be logged in to deploy to FastAPI Cloud.infozWhat would you like to do?authzLogin to my existing accountr   r   zJoin the waiting listr   r   r3   zStarting deploymentzDeploying from path: %sz(No app config found, configuring new app)r   z5Existing app config found, proceeding with deploymentzDeploying app...zChecking app...T)	transientzChecking app with ID: %sNzApp not found in APIz>App not found. Make sure you're logged in the correct account.zeIf you deleted this app, you can run [bold]fastapi cloud unlink[/] to unlink the local configuration.ZtipzCreating archive for deploymentzarchive.tarzCreating deploymentr   zCreating deployment for app: %sz2Deployment created successfully! Deployment slug: zUploading deployment...z!Deployment uploaded successfully!z"Waiting for deployment to complete)r   z%Skipping deployment wait as requestedz-Check the status of your deployment at [link=r   r   ) r4   r5   r   r   Zprint_titler   r   r   r   r   r   r   r   r   cwdr   r   r   r   rr   r   Z	set_errortempfileTemporaryDirectoryr@   rB   rv   r   rC   r   r   rs   )r   r   r   choicer   r   r   r   temp_dirrz   r   r$   r$   r%   deploy  s   


	












 

[$r   )NF)Qr   loggingr   r   r   enumr   	itertoolsr   pathlibr   typingr   r   r   r   r	   r8   r6   r   Zhttpxr
   Zpydanticr   r   r   Z	rich.textr   Zrich_toolkitr   Zrich_toolkit.menur   Ztyping_extensionsr   Z fastapi_cloud_cli.commands.loginr   Zfastapi_cloud_cli.utils.apir   r   r   Zfastapi_cloud_cli.utils.appsr   r   r   Zfastapi_cloud_cli.utils.authr   Zfastapi_cloud_cli.utils.clir   r   Z'fastapi_cloud_cli.utils.pydantic_compatr   r   r   	getLoggerrE   r4   rH   r&   boolr/   r@   rA   rV   rW   r]   r^   rq   rv   rw   r   r   r   r   r   r   r   r   r   r   ZArgumentr   r$   r$   r$   r%   <module>   s    

$	)
E
F
X

