o
    !h'Q                  
   @   s\  d dl Z d dlZd dlZ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mZ d dlZd dlZd dlmZ d dlmZ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) d dl*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 e5e6Z7dede8fddZ9dede:fddZ;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d/d0ZEd1e8dee? fd2d3ZFd e8dee? fd4d5ZGd(e8d6ee8e8f ddfd7d8ZHd-e8dee8ddf fd9d:ZIg d;ZJg d<ZKd=e!d>ede+fd?d@ZLd=e!d(e8dAeBddfdBdCZMd=e!d(e8ddfdDdEZNG dFdG dGeZOdHeOd=e!ddfdIdJZPd=e!ddfdKdLZQ		MdUde%eedf ejRdNdOf dPe%e:ej#dQdRdOf defdSdTZSdS )V    N)Enum)cycle)Path)AnyDict	GeneratorListOptionalUnion)Client)	BaseModelEmailStrTypeAdapterValidationError)Text)RichToolkit)Option)	Annotated)login)	APIClient)	AppConfigget_app_configwrite_app_config)is_logged_in)get_rich_toolkithandle_http_errors)"validate_environment_variable_namepathreturnc                 C   s   | j S N)namer    r"   c/var/www/html/pro-man-master/venv/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_cachec                 3   s    | ]}| j v V  qd S r   )parts).0partr!   r"   r#   	<genexpr>)   s    z(_should_exclude_entry.<locals>.<genexpr>Tz.pycF)anysuffix)r   parts_to_excluder"   r!   r#   _should_exclude_entry&   s   
r-   c                 C   s   t d|  tj| td}t }t d| dt  }t	|| d }t d| d}t
|d }|D ]}| r?q8|j||| d	 |d
7 }q8W d    n1 sXw   Y  t d| |S )Nz&Starting archive creation for path: %s)should_exclude_entryzCreated temp directory: %szfastapi-cloud-deploy-z.tarzArchive will be created at: %sr   w)arcname   z*Archive created successfully with %s files)loggerdebugrignorewalkr-   tempfilemkdtempuuiduuid4r   tarfileopenis_diraddrelative_to)r   filestemp_dirr    tar_path
file_counttarfilenamer"   r"   r#   archive2   s$   
rE   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#   rF   J   s   
 rF   c                  C   sR   t  } | d}|  | d }W d    n1 sw   Y  dd |D S )Nz/teams/datac                 S      g | ]}t |qS r"   )rF   model_validater'   teamr"   r"   r#   
<listcomp>W       z_get_teams.<locals>.<listcomp>r   getraise_for_statusjson)clientresponserO   r"   r"   r#   
_get_teamsP   s   
r\   c                   @   s   e Zd ZU eed< eed< dS )AppResponserG   rH   NrI   r"   r"   r"   r#   r]   Z   s   
 r]   team_idapp_namec                 C   sT   t  }|jd|| dd}|  t| W  d    S 1 s#w   Y  d S )N/apps/)r    r^   rY   )r   postrX   r]   rQ   rY   )r^   r_   rZ   r[   r"   r"   r#   _create_app_   s   $rc   c                   @   sV   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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successfailedstatusr   c                 C   sV   | 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 buildBuilding
ExtractingzExtracting failedzBuilding imagezBuild failed	DeployingzDeploying failed	VerifyingzVerifying failedSuccessFailed)re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   )clsrr   r"   r"   r#   to_human_readablez   s    z"DeploymentStatus.to_human_readableN)rJ   rK   rL   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   classmethodrM   rz   r"   r"   r"   r#   rd   k   s     rd   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 )CreateDeploymentResponserG   app_idrH   rr   dashboard_urlurlN)rJ   rK   rL   rM   rN   rd   r"   r"   r"   r#   r|      s   
 r|   r}   c                 C   sR   t  }|d|  d}|  t| W  d    S 1 s"w   Y  d S )Nr`   /deployments/)r   rb   rX   r|   rQ   rY   )r}   rZ   r[   r"   r"   r#   _create_deployment   s
   $r   c                   @   s&   e Zd ZU eed< eeef ed< dS )RequestUploadResponser   fieldsN)rJ   rK   rL   rM   rN   r   r"   r"   r"   r#   r      s   
 r   deployment_idarchive_pathc              	   C   s*  t d|  t d|| j t x}t \}t d |d|  d}|  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 APIr   z/uploadzReceived upload URL: %szStarting file upload to S3filerb)rO   r?   z"File upload completed successfullyz%Notifying API that upload is completez/upload-completez%Upload notification sent successfully)r2   r3   statst_sizer   r   rb   rX   r   rQ   rY   r   r   r;   )r   r   fastapi_clientrZ   r[   upload_dataupload_response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|S )Nr`   i  )r   rW   status_coderX   rY   r]   rQ   )r   rZ   r[   rO   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 )Nr`   r^   )paramsrO   c                 S   rP   r"   )r]   rQ   r'   appr"   r"   r#   rT      rU   z_get_apps.<locals>.<listcomp>rV   )r^   rZ   r[   rO   r"   r"   r#   	_get_apps   s   r   env_varsc                 C   sJ   t  }|jd|  d|d}|  W d    d S 1 sw   Y  d S )Nr`   z/environment-variables/ra   )r   patchrX   )r}   r   rZ   r[   r"   r"   r#   _create_environment_variables   s   
"r   c              	   c   s    t  8}|jdd|  ddd}|  | E d H  W d    n1 s'w   Y  W d    d S W d    d S 1 s?w   Y  d S )NGETr   z/build-logs<   )timeout)r   streamrX   
iter_lines)r   rZ   r[   r"   r"   r#   _stream_build_logs   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?   📉 Server space running low. Time to delete those cat videos?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:rS   c                 S      g | ]
}t |j|d qS r    value)r   r    rR   r"   r"   r#   rT         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.r1   z%Select the app you want to deploy to:c                 S   r   r   )r   rH   r   r"   r"   r#   rT   7  r   )r   zWhat's your app name?)titler   zCreating app...r   z$App created successfully! App slug: )r}   r^   )confirmtyperExit
print_lineprogressr   r\   askr   rG   printinputr$   rc   logrH   r   r   )
r   r   r   teamsrS   create_new_appappsr   r_   
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	|d t
|jD ]}t | }t|}	d|	v r^|t|	d   |	ddkr|d |d|j d|j d |d |d|j d|j d  n9|	ddkr|d |d|j d|j d td|dkrt t}t | dkrt||_t }qAW d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nu+   Checking the status of your deployment 👀cloudr   z'You can also check the status at [link=][/link]g        T   )inline_logslines_to_show)r   r   typecomplete u3   🐔 Ready the chicken! Your app is ready at [link=z)You can also check the app logs at [link=rq   u>   😔 Oh no! Something went wrong. Check out the logs at [link=r1         )r   WAITING_MESSAGESr   r   r~   time	monotonicr   nextr   r   rG   rY   loadsr   r   	from_ansirstriprW   r   r   r   LONG_WAIT_MESSAGESr   )
r   r}   r   messagestime_elapsed
started_atlast_message_changed_atr   linerO   r"   r"   r#   _wait_for_deploymentN  sb   






"r   c              	   C   s   | j ddds	d S |   i }	 | jddd}| dkrnt|s(| d	 n| jd
dd}|||< |   q|   | d'}t| t|| W d    n1 sVw   Y  |	d W d    d S 1 skw   Y  d S )Nz+Do you want to setup environment variables?envr   Tz4Enter the environment variable name: [ENTER to skip]F)requiredr   z)[error]Invalid environment variable name.z%Enter the environment variable value:)passwordz#Setting up environment variables...z*Environment variables set up successfully!)
r   r   r   stripr   r   r   r   r   r   )r   r}   r   keyr   r   r"   r"   r#   _setup_environment_variables  s6   
"r   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)rJ   rK   rL   r   rN   r    r	   rM   r   r   r   r   r   r   r"   r"   r"   r#   r     s   
 r   resultc              
   C   s   | dD}t +}t| |jd| jddd}|  W d    n1 s(w   Y  W d    n1 s7w   Y  |d W d    d S 1 sLw   Y  d S )NzSending your request...z/users/waiting-listrY   )modera   u9   Let's go! Thanks for your interest in FastAPI Cloud! 🚀)r   r   r   rb   
model_dumprX   r   )r   r   r   rZ   r[   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|d	}| 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d#|i|}W n ty   | d$ Y d S w |   | jd%d&dr|   t||  tt tjd'd(g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)r   	validator)r   z?Do you want to get access faster by giving us more information?zWaitlist form)styler    NamezJohn Doe)labelplaceholderr   Organizationz	Acme Inc.rS   rF   zTeam Ar   Role	Developerr   LocationzSan Franciscor   z%How do you plan to use FastAPI Cloud?zI'm building a web appr   zSecret code123456r   z.[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]
termsr;   zraycast://confettiF)stdoutstderrcheck)rich_toolkit.formr   r   r   r   r   r   r   r   r   	add_inputrunrQ   r   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   s&  t d t d| | t x}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}|  t||j |  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 d! t| pt }|jd"d#B}t|( t d$|j t|j}	|d%|	j  |d& t|	j| W d   n	1 s6w   Y  |d' W d   n	1 sKw   Y  |  |set 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!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   r1   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.z_If you deleted this app, you can run [bold]fastapi unlink[/] to unlink the local configuration.tipzCreating archive for deploymentz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   )r2   r3   r   r   print_titler   r   r   r   r   r  r   r   r   cwdr   r   r   r}   r   r   r   	set_errorrE   rG   r   r   rH   r   r   r~   )
r   r  r   choicer   r   r   r   r   r   r"   r"   r#   deploy!  s   


	














[$r  )NF)Tr   rY   loggingr   r:   r6   r   r8   enumr   	itertoolsr   pathlibr   typingr   r   r   r   r	   r
   r4   r   httpxr   pydanticr   r   r   r   	rich.textr   rich_toolkitr   rich_toolkit.menur   typing_extensionsr    fastapi_cloud_cli.commands.loginr   fastapi_cloud_cli.utils.apir   fastapi_cloud_cli.utils.appsr   r   r   fastapi_cloud_cli.utils.authr   fastapi_cloud_cli.utils.clir   r   fastapi_cloud_cli.utils.envr   	getLoggerrJ   r2   rM   r$   boolr-   rE   rF   r\   r]   rc   rd   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  Argumentr  r"   r"   r"   r#   <module>   s     

"	)

E
@'
W

