Coverage for src/fastapi_cloud_cli/commands/deploy/command.py: 100%

174 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-11-09 00:25 +0000

1import logging 2udvdwdxdydzdAd

2import tempfile 2udvdwdxdydzdAd

3from pathlib import Path 2udvdwdxdydzdAd

4from typing import Annotated, Any, cast 2udvdwdxdydzdAd

5 

6import typer 2udvdwdxdydzdAd

7from pydantic import BaseModel 2udvdwdxdydzdAd

8 

9from fastapi_cloud_cli._app import app, cloud_app 2udvdwdxdydzdAd

10from fastapi_cloud_cli.api import APIClient, DeploymentStatus 2udvdwdxdydzdAd

11from fastapi_cloud_cli.commands.deploy.archive import _get_large_files, archive 2udvdwdxdydzdAd

12from fastapi_cloud_cli.commands.deploy.cloud import ( 2udvdwdxdydzdAd

13 AppResponse, 

14 ArchiveTooLargeError, 

15 CreateDeploymentResponse, 

16 _create_deployment, 

17 _get_app, 

18) 

19from fastapi_cloud_cli.commands.deploy.configure import _configure_app 2udvdwdxdydzdAd

20from fastapi_cloud_cli.commands.deploy.upload import _cancel_upload, _upload_deployment 2udvdwdxdydzdAd

21from fastapi_cloud_cli.commands.deploy.wait import _wait_for_deployment 2udvdwdxdydzdAd

22from fastapi_cloud_cli.commands.login import _interactive_login 2udvdwdxdydzdAd

23from fastapi_cloud_cli.utils.apps import get_app_config 2udvdwdxdydzdAd

24from fastapi_cloud_cli.utils.auth import Identity 2udvdwdxdydzdAd

25from fastapi_cloud_cli.utils.cli import FastAPIRichToolkit, get_rich_toolkit 2udvdwdxdydzdAd

26from fastapi_cloud_cli.utils.errors import ErrorCode 2udvdwdxdydzdAd

27from fastapi_cloud_cli.utils.execution import JsonOutputOption, is_ci_enabled 2udvdwdxdydzdAd

28 

29logger = logging.getLogger(__name__) 2udvdwdxdydzdAd

30 

31 

32class DeployOutput(BaseModel): 2udvdwdxdydzdAd

33 deployment_id: str 2udvdwdxdydzdAd

34 app_id: str 2udvdwdxdydzdAd

35 slug: str 2udvdwdxdydzdAd

36 status: DeploymentStatus 2udvdwdxdydzdAd

37 dashboard_url: str 2udvdwdxdydzdAd

38 url: str 2udvdwdxdydzdAd

39 

40 

41def _get_deploy_output(deployment: CreateDeploymentResponse) -> DeployOutput: 2udvdwdxdydzdAd

42 return DeployOutput( 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb

43 deployment_id=deployment.id, 

44 app_id=deployment.app_id, 

45 slug=deployment.slug, 

46 status=deployment.status, 

47 dashboard_url=deployment.dashboard_url, 

48 url=deployment.url, 

49 ) 

50 

51 

52def _get_large_file_warnings( 2udvdwdxdydzdAd

53 large_files: list[tuple[Path, int]], 

54 *, 

55 threshold_mb: int, 

56) -> list[dict[str, Any]]: 

57 if not large_files: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

58 return [] 2YbJ ZbK qbrbsb6 nd~c4 tbad]ccb0b1b2bebL 7 8 ubvbwbxbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, oddd' 6bed_cgb6c7c8clbR - . 7b8b9b!b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdfd( :bgd`chb#c$c%cmbU ; = ;b=b?b@b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qdhd) dcid{cib)c*c+cnbX [ ] ecfcgchcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdbd5 Kbcd^cdbtcucvcfbO # $ LbMbNbObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdjd* zckd|cjb.c/c:cob0 ` { AcBcCcDcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdld+ Qcmd}ckb?c@c[cpb3 ~ abRcScTcUcVcWcXcYcZc0cbb1c2c3c

59 

60 count = len(large_files) 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

61 message = ( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

62 f"1 uploaded file is larger than {threshold_mb} MB." 

63 if count == 1 

64 else f"{count} uploaded files are larger than {threshold_mb} MB." 

65 ) 

66 

67 return [ 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

68 { 

69 "code": "large_files", 

70 "message": message, 

71 "files": [ 

72 {"path": path.as_posix(), "size_bytes": size} 

73 for path, size in large_files 

74 ], 

75 } 

76 ] 

77 

78 

79def _render_app_id_mismatch( 2udvdwdxdydzdAd

80 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str 

81) -> None: 

82 toolkit.print_error(message) 2dfefffgfhfifjf

83 toolkit.print_line() 2dfefffgfhfifjf

84 toolkit.print_hint(hint) 2dfefffgfhfifjf

85 

86 

87def _render_app_not_found( 2udvdwdxdydzdAd

88 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str 

89) -> None: 

90 toolkit.print_line() 23dPd4dQd5dRd6dSd7dTd8dUd9dVd

91 

92 

93def _render_linked_app_not_found( 2udvdwdxdydzdAd

94 toolkit: FastAPIRichToolkit, *, code: ErrorCode, message: str, hint: str 

95) -> None: 

96 _render_app_not_found(toolkit, code=code, message=message, hint=hint) 2PdQdRdSdTdUdVd

97 toolkit.print_hint( 2PdQdRdSdTdUdVd

98 "If you deleted this app, you can run [bold]fastapi cloud unlink[/] to unlink the local configuration." 

99 ) 

100 

101 

102def _confirm_home_directory_deploy( 2udvdwdxdydzdAd

103 toolkit: FastAPIRichToolkit, *, json_output: bool 

104) -> None: 

105 if json_output or is_ci_enabled(): 2kf6 Tflf, Ufmf: Vfnf@ Wfof! Xfpf_ Yfqf} Zf

106 toolkit.fail( 2TfUfVfWfXfYfZf

107 "invalid_input", 

108 "Refusing to deploy your home directory.", 

109 hint="Pass the directory of your app, or use --force.", 

110 ) 

111 

112 if not toolkit.confirm( 2kf6 lf, mf: nf@ of! pf_ qf}

113 "You are deploying your home directory. Do you want to continue?", 

114 default=False, 

115 emoji="🚨", 

116 ): 

117 toolkit.print_line() 2kflfmfnfofpfqf

118 toolkit.print("Deployment cancelled.") 2kflfmfnfofpfqf

119 raise typer.Exit(0) 2kflfmfnfofpfqf

120 

121 toolkit.print_line() 16,:@!_}

122 

123 

124def _check_app_directory( 2udvdwdxdydzdAd

125 toolkit: FastAPIRichToolkit, *, app: AppResponse, path_to_deploy: Path 

126) -> None: 

127 """Stop before uploading when the app's directory isn't in the upload.""" 

128 if app.directory is None or (path_to_deploy / app.directory).is_dir(): 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

129 return 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

130 

131 if app.github_repository: 2BdCdDdEdFdGdHdIdJdKdLdMdNdOd

132 hint = ( 2CdEdGdIdKdMdOd

133 f"This app is connected to {app.github_repository} and builds from " 

134 f"`{app.directory}` in that repository. Run " 

135 f"`fastapi deploy --app-id {app.id}` from the repository root, or use --force." 

136 ) 

137 else: 

138 hint = ( 2BdDdFdHdJdLdNd

139 "Deploy from the folder that contains it, update the app directory " 

140 "with `fastapi cloud apps update --directory`, or use --force." 

141 ) 

142 

143 toolkit.fail( 2BdCdDdEdFdGdHdIdJdKdLdMdNdOd

144 "invalid_input", 

145 f"The app directory `{app.directory}` doesn't exist in {path_to_deploy}.", 

146 hint=hint, 

147 ) 

148 

149 

150@app.command() 2udvdwdxdydzdAd

151@cloud_app.command() 2udvdwdxdydzdAd

152def deploy( 2udvd.fwdxd/fydzdAd:f

153 path: Annotated[ 

154 Path | None, 

155 typer.Argument( 

156 help="Path to the directory to deploy (defaults to current directory)" 

157 ), 

158 ] = None, 

159 skip_wait: Annotated[ 

160 bool, typer.Option("--no-wait", help="Skip waiting for deployment status") 

161 ] = False, 

162 provided_app_id: Annotated[ 

163 str | None, 

164 typer.Option( 

165 "--app-id", 

166 help="Application ID to deploy to", 

167 envvar="FASTAPI_CLOUD_APP_ID", 

168 ), 

169 ] = None, 

170 large_file_threshold: Annotated[ 

171 int, 

172 typer.Option( 

173 help="File size threshold in MB for warning about large files", 

174 min=1, 

175 envvar="FASTAPI_CLOUD_LARGE_FILE_THRESHOLD", 

176 ), 

177 ] = 10, 

178 json_output: JsonOutputOption = False, 

179 force: Annotated[ 

180 bool, 

181 typer.Option( 

182 "--force", 

183 help="Deploy even if the app directory is missing or the path is your home directory", 

184 ), 

185 ] = False, 

186) -> Any: 

187 """ 

188 Deploy a [bold]FastAPI[/bold] app to FastAPI Cloud. 

189 """ 

190 logger.debug("Deploy command started") 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

191 logger.debug( 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

192 "Deploy path: %s, skip_wait: %s, app_id: %s", path, skip_wait, provided_app_id 

193 ) 

194 

195 identity = Identity() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

196 use_deploy_token = identity.has_deploy_token() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

197 has_auth = use_deploy_token or identity.is_logged_in() 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

198 

199 logger.debug( 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

200 "Authentication mode: %s", "deploy token" if use_deploy_token else "user token" 

201 ) 

202 

203 with get_rich_toolkit(json_output=json_output) as toolkit: 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

204 if not has_auth: 2beYbJ ZbFfce!d#dK qbrbsbkf6 Bdnda rf7f~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvb'fdeeefej k wbh l xbybzbAbgeBbCbPdDbheMfiejekeWd9 EblemeneFbGboe4cP 5cGfpe%d'dQ 3b4b5blf, Ddodc tf8fdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8b(fqereseu v 9bm w !b#b$b%bte'b(bQd)bueNfvewexeXd/ *byezeAe+b,bBe9cS !cHfCe)d*dT -b.b/bmf: Fdpdd vf9ffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=b)fDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeOfIeJeKeYd? |bLeMeNe}b~bOe'cV (cIfPe,d-dW acbcccnf@ Hdqde xf!fhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfc*fQeReSeA B gco C hcicjckcTelcmcSdncUePfVeWeXeZd^ ocYeZe0epcqc1ercM scJf2e/d:dN HbIbJbof! Jdrdb zf#fbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb+f3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7eQf8e9e!e0d% Vb#e$e%eWbXb'e,cY -cKf(e=d?dZ wcxcycpf_ Ldsdf Bf$fjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc,f)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-eRf.e/e:e1d| Kc;e=e?eLcMc@e;c1 =cLf[e[d]d2 NcOcPcqf} Ndtdg Df%fld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc-f]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{eSf|e}e~e2dbb1cafbfcf2c3c

205 logger.debug("User not logged in, starting login") 2Ff7f'fMfWdGf8f(fNfXdHf9f)fOfYdIf!f*fPfZdJf#f+fQf0dKf$f,fRf1dLf%f-fSf2d

206 

207 if is_ci_enabled(): 2Ff7f'fMfWdGf8f(fNfXdHf9f)fOfYdIf!f*fPfZdJf#f+fQf0dKf$f,fRf1dLf%f-fSf2d

208 toolkit.fail( 2'f(f)f*f+f,f-f

209 "not_logged_in", 

210 "FASTAPI_CLOUD_TOKEN is required to deploy from CI.", 

211 hint=( 

212 "Run `fastapi cloud setup-ci` to configure a deploy token, " 

213 "or set FASTAPI_CLOUD_TOKEN in your CI secrets." 

214 ), 

215 ) 

216 

217 if json_output: 2Ff7fMfWdGf8fNfXdHf9fOfYdIf!fPfZdJf#fQf0dKf$fRf1dLf%fSf2d

218 toolkit.fail( 27f8f9f!f#f$f%f

219 "not_logged_in", 

220 "No credentials found.", 

221 hint="Run `fastapi cloud login` or set FASTAPI_CLOUD_TOKEN.", 

222 ) 

223 

224 toolkit.print_title( 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

225 "Welcome to FastAPI Cloud!", 

226 tag="FastAPI Cloud", 

227 emoji="👋", 

228 animate=True, 

229 ) 

230 toolkit.print_line() 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

231 

232 if identity.user_token and identity.is_user_token_expired(): 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

233 toolkit.print("Your session has expired. Please log in again.") 2MfNfOfPfQfRfSf

234 else: 

235 toolkit.print("You need to be logged in to deploy to FastAPI Cloud.") 2FfWdGfXdHfYdIfZdJf0dKf1dLf2d

236 

237 toolkit.print_line() 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

238 should_login = toolkit.confirm( 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

239 "Do you want to log in now?", 

240 default=True, 

241 ) 

242 

243 if not should_login: 2FfMfWdGfNfXdHfOfYdIfPfZdJfQf0dKfRf1dLfSf2d

244 toolkit.print_line() 2FfGfHfIfJfKfLf

245 toolkit.print("Deployment cancelled.") 2FfGfHfIfJfKfLf

246 raise typer.Exit(0) 2FfGfHfIfJfKfLf

247 

248 toolkit.print_line() 2MfWdNfXdOfYdPfZdQf0dRf1dSf2d

249 _interactive_login(toolkit) 2MfWdNfXdOfYdPfZdQf0dRf1dSf2d

250 toolkit.print_line() 2WdXdYdZd0d1d2d

251 

252 with APIClient(use_deploy_token=use_deploy_token) as client: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

253 # the welcome title already shows the header when logging in 

254 if has_auth: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

255 toolkit.print_title("FastAPI Cloud", animate=True) 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejeke9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexe/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKe? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXe^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~ebb1cafbfcf2c3c

256 toolkit.print_line() 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejeke9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexe/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKe? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXe^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~ebb1cafbfcf2c3c

257 

258 if use_deploy_token: 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

259 toolkit.print( 2cb_dgb`dhb{dib|ddb}djb~dkbae

260 "Using token from [bold blue]FASTAPI_CLOUD_TOKEN[/] environment variable", 

261 ) 

262 toolkit.print_line() 2cb_dgb`dhb{dib|ddb}djb~dkbae

263 

264 path_to_deploy = path or Path.cwd() 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

265 logger.debug("Deploying from path: %s", path_to_deploy) 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

266 

267 if not force and path_to_deploy.resolve() == Path.home().resolve(): 2beYbJ Zbce!d#dK qbrbsbkf6 Bdnda rf~c4 $d0fTfsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5blf, Ddodc tfdd' (d1fUfufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/bmf: Fdpdd vffd( +d2fVfwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbcccnf@ Hdqde xfhd) .d3fWfyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJbof! Jdrdb zfbd5 ;d4fXfAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcycpf_ Ldsdf Bfjd* @d5fYfCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPcqf} Ndtdg Dfld+ ^d6fZfEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

268 _confirm_home_directory_deploy(toolkit, json_output=json_output) 2kf6 Tflf, Ufmf: Vfnf@ Wfof! Xfpf_ Yfqf} Zf

269 

270 app_config = get_app_config(path_to_deploy) 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $d0fsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (d1fufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +d2fwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .d3fyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;d4fAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @d5fCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^d6fEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

271 

272 if app_config and provided_app_id and app_config.app_id != provided_app_id: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $d0fsfCdtbad]ccb0b3d1b2bdfeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (d1fufEd6bed_cgb6c4d7c8ceflb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +d2fwfGd:bgd`chb#c5d$c%cffmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .d3fyfIddcid{cib)c6d*c+cgfnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;d4fAfKdKbcd^cdbtc7ducvchffb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @d5fCfMdzckd|cjb.c8d/c:cifob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^d6fEfOdQcmd}ckb?c9d@c[cjfpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

273 toolkit.fail( 20fdf1fef2fff3fgf4fhf5fif6fjf

274 "invalid_input", 

275 f"Provided app ID ({provided_app_id}) does not match the local config ({app_config.app_id}).", 

276 hint=( 

277 "Run `fastapi cloud unlink` to remove the local config, " 

278 "or remove --app-id / unset FASTAPI_CLOUD_APP_ID to use the configured app." 

279 ), 

280 render_output=_render_app_id_mismatch, 

281 ) 

282 

283 if provided_app_id: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 $dsfCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' (dufEd6bed_cgb6c4d7c8clb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( +dwfGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) .dyfIddcid{cib)c6d*c+cnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 ;dAfKdKbcd^cdbtc7ducvcfb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* @dCfMdzckd|cjb.c8d/c:cob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ ^dEfOdQcmd}ckb?c9d@c[cpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

284 target_app_id = provided_app_id 2$d0b3d1b2b(d6c4d7c8c+d#c5d$c%c.d)c6d*c+c;dtc7ducvc@d.c8d/c:c^d?c9d@c[c

285 elif app_config: 2beYbJ Zbce!d#dK qbrbsb6 Bdnda rf~c4 sfCdtbad]ccbeb_dL 7 8 ubvbdeeefej k wbh l xbybzbAbgeBbCbPdDbheiejekeWd9 EblemeneFbGboe4cP 5cpe%d'dQ 3b4b5b, Ddodc tfdd' ufEd6bed_cgblb`dR - . 7b8bqereseu v 9bm w !b#b$b%bte'b(bQd)buevewexeXd/ *byezeAe+b,bBe9cS !cCe)d*dT -b.b/b: Fdpdd vffd( wfGd:bgd`chbmb{dU ; = ;b=bDeEeFex y ?bn z @b[b]b^bGe_b`bRd{bHeIeJeKeYd? |bLeMeNe}b~bOe'cV (cPe,d-dW acbccc@ Hdqde xfhd) yfIddcid{cibnb|dX [ ] ecfcQeReSeA B gco C hcicjckcTelcmcSdncUeVeWeXeZd^ ocYeZe0epcqc1ercM sc2e/d:dN HbIbJb! Jdrdb zfbd5 AfKdKbcd^cdbfb}dO # $ LbMb3e4e5ep q Nbi r ObPbQbRb6eSbTbTdUb7e8e9e!e0d% Vb#e$e%eWbXb'e,cY -c(e=d?dZ wcxcyc_ Ldsdf Bfjd* CfMdzckd|cjbob~d0 ` { AcBc)e*e+eD E Ccs F DcEcFcGc,eHcIcUdJc-e.e/e:e1d| Kc;e=e?eLcMc@e;c1 =c[e[d]d2 NcOcPc} Ndtdg Dfld+ EfOdQcmd}ckbpbae3 ~ abRcSc]e^e_eG H Tct I UcVcWcXc`eYcZcVd0c{e|e}e~e2dbb1cafbfcf2c3c

286 target_app_id = app_config.app_id 2YbZbqbrbsb6 Bdnda ~c4 Cdtbad]ccbeb_dubvbj k wbh l xbybzbAbBbCbPdDbEbFbGb4c5c3b4b5b, Ddodc dd' Ed6bed_cgblb`d7b8bu v 9bm w !b#b$b%b'b(bQd)b*b+b,b9c!c-b.b/b: Fdpdd fd( Gd:bgd`chbmb{d;b=bx y ?bn z @b[b]b^b_b`bRd{b|b}b~b'c(cacbccc@ Hdqde hd) Iddcid{cibnb|decfcA B gco C hcicjckclcmcSdncocpcqcrcscHbIbJb! Jdrdb bd5 KdKbcd^cdbfb}dLbMbp q Nbi r ObPbQbRbSbTbTdUbVbWbXb,c-cwcxcyc_ Ldsdf jd* Mdzckd|cjbob~dAcBcD E Ccs F DcEcFcGcHcIcUdJcKcLcMc;c=cNcOcPc} Ndtdg ld+ OdQcmd}ckbpbaeRcScG H Tct I UcVcWcXcYcZcVd0c1c2c3c

287 else: 

288 if json_output or is_ci_enabled(): 2beJ ce!d#dK rfsfL 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ tfufR - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT vfwfU ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW xfyfX [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN zfAfO # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ BfCf0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 DfEf3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf

289 toolkit.fail( 2rfsftfufvfwfxfyfzfAfBfCfDfEf

290 "missing_required_input", 

291 "App ID is required.", 

292 hint="Pass --app-id or run `fastapi cloud apps create --link` first.", 

293 ) 

294 

295 logger.debug("No app config found, configuring new app") 2beJ ce!d#dK L 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ R - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT U ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW X [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN O # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ 0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf

296 

297 app_config = _configure_app( 2beJ ce!d#dK L 7 8 deeefegeheiejekeWd9 lemeneoeP pe%d'dQ R - . qereseteuevewexeXd/ yezeAeBeS Ce)d*dT U ; = DeEeFeGeHeIeJeKeYd? LeMeNeOeV Pe,d-dW X [ ] QeReSeTeUeVeWeXeZd^ YeZe0e1eM 2e/d:dN O # $ 3e4e5e6e7e8e9e!e0d% #e$e%e'eY (e=d?dZ 0 ` { )e*e+e,e-e.e/e:e1d| ;e=e?e@e1 [e[d]d2 3 ~ ab]e^e_e`e{e|e}e~e2dbbafbfcf

298 toolkit=toolkit, 

299 client=client, 

300 path_to_deploy=path_to_deploy, 

301 ) 

302 toolkit.print_line() 2J !d#dK L 7 8 9 P %d'dQ R - . / S )d*dT U ; = ? V ,d-dW X [ ] ^ M /d:dN O # $ % Y =d?dZ 0 ` { | 1 [d]d2 3 ~ abbb

303 

304 target_app_id = app_config.app_id 2J !d#dK L 7 8 9 P %d'dQ R - . / S )d*dT U ; = ? V ,d-dW X [ ] ^ M /d:dN O # $ % Y =d?dZ 0 ` { | 1 [d]d2 3 ~ abbb

305 

306 if provided_app_id: 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

307 toolkit.print( 2$d0b3d1b2b(d6c4d7c8c+d#c5d$c%c.d)c6d*c+c;dtc7ducvc@d.c8d/c:c^d?c9d@c[c

308 f"Deploying to app [blue]{target_app_id}[/blue]...", emoji="🚀" 

309 ) 

310 else: 

311 toolkit.print("Deploying app...", emoji="🚀") 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 Cdtbad]ccbeb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' Ed6bed_cgblb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( Gd:bgd`chbmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) Iddcid{cibnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 KdKbcd^cdbfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* Mdzckd|cjbob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ OdQcmd}ckbpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

312 

313 toolkit.print_line() 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

314 

315 with toolkit.progress("Checking app...", transient=True) as progress: 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

316 with client.handle_http_errors(progress, toolkit=toolkit): 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

317 logger.debug("Checking app with ID: %s", target_app_id) 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

318 app = _get_app(client=client, app_id=target_app_id) 2YbJ Zb!d#dK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2beb_dL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5c%d'dQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clb`dR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !c)d*dT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmb{dU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (c,d-dW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnb|dX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM sc/d:dN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfb}dO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -c=d?dZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob~d0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c[d]d2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpbae3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

319 

320 if app is None: 2YbJ ZbK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (cW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnbX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

321 logger.debug("App not found in API") 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd

322 progress.set_error( 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd

323 "App not found. Make sure you're logged in the correct account." 

324 ) 

325 

326 if app is None: 2YbJ ZbK qbrbsb6 Bdnda ~c4 $dCdtbad]ccb0b3d1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbPdDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' (dEd6bed_cgb6c4d7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(bQd)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( +dGd:bgd`chb#c5d$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`bRd{b? |b}b~b'cV (cW acbccc@ Hdqde hd) .dIddcid{cib)c6d*c+cnbX [ ] ecfcA B gco C hcicjckclcmcSdnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 ;dKdKbcd^cdbtc7ducvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbTdUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* @dMdzckd|cjb.c8d/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcUdJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ ^dOdQcmd}ckb?c9d@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZcVd0cbb1c2c3c

327 toolkit.fail( 2$d3dPd(d4dQd+d5dRd.d6dSd;d7dTd@d8dUd^d9dVd

328 "not_found", 

329 "App not found. Make sure you're logged in the correct account.", 

330 render_output=( 

331 _render_app_not_found 

332 if provided_app_id 

333 else _render_linked_app_not_found 

334 ), 

335 ) 

336 

337 app = cast(AppResponse, app) 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

338 

339 if not force: 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

340 _check_app_directory(toolkit, app=app, path_to_deploy=path_to_deploy) 2YbJ ZbK qbrbsb6 Bdnda ~c4 Cdtbad]ccb0b1b2bL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, Ddodc dd' Ed6bed_cgb6c7c8cR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: Fdpdd fd( Gd:bgd`chb#c$c%cU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ Hdqde hd) Iddcid{cib)c*c+cX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! Jdrdb bd5 KdKbcd^cdbtcucvcO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ Ldsdf jd* Mdzckd|cjb.c/c:c0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} Ndtdg ld+ OdQcmd}ckb?c@c[c3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

341 

342 large_files = _get_large_files( 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

343 path_to_deploy, threshold_mb=large_file_threshold 

344 ) 

345 warnings = _get_large_file_warnings( 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

346 large_files, 

347 threshold_mb=large_file_threshold, 

348 ) 

349 if large_files: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

350 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

351 f"Some uploaded files are larger than {large_file_threshold} MB:", 

352 emoji="⚠️", 

353 ) 

354 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

355 for fname, fsize in large_files[:3]: 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

356 fsize_mb = fsize // (1024 * 1024) 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

357 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

358 f"• [bold]{fname}[/bold] [yellow]({fsize_mb} MB)[/yellow]" 

359 ) 

360 is_more = len(large_files) > 3 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

361 if is_more: 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

362 toolkit.print(f"[dim]...and {len(large_files) - 3} more[/dim]") 1hmnoist

363 

364 large_files_docs_url = "https://fastapicloud.com/docs/fastapi-cloud-cli/deploy/#large-files-warning" 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

365 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

366 toolkit.print( 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

367 f"Read more: [link={large_files_docs_url}]{large_files_docs_url}[/link]", 

368 emoji="💡", 

369 ) 

370 toolkit.print_line() 1ajkhlcuvmwdxynzeABoCbpqirfDEsFgGHtI

371 

372 will_wait = not skip_wait and not json_output 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

373 

374 with tempfile.TemporaryDirectory() as temp_dir: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

375 logger.debug("Creating archive for deployment") 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

376 archive_path = Path(temp_dir) / "archive.tar" 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

377 file_count = archive(path_to_deploy, archive_path) 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

378 archive_size = archive_path.stat().st_size 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

379 

380 if file_count == 0: 2YbJ ZbK qbrbsb6 nda ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, odc dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: pdd fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ qde hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! rdb bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ sdf jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} tdg ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

381 toolkit.fail( 2ndodpdqdrdsdtd

382 "invalid_input", 

383 f"Nothing to deploy: no files to upload in {path_to_deploy}.", 

384 hint=( 

385 "Check the path, and that .gitignore or " 

386 ".fastapicloudignore don't exclude your app's files." 

387 ), 

388 ) 

389 

390 with ( 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb

391 toolkit.progress( 

392 title="Creating deployment", 

393 # the build status replaces this when waiting 

394 transient=will_wait, 

395 done_emoji="📦", 

396 ) as progress, 

397 client.handle_http_errors(progress, toolkit=toolkit), 

398 ): 

399 logger.debug("Creating deployment for app: %s", app.id) 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

400 

401 try: 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

402 deployment = _create_deployment( 2YbJ ZbK qbrbsb6 a ~c4 tbad]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c dd' 6bed_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d fd( :bgd`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e hd) dcid{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b bd5 Kbcd^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f jd* zckd|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g ld+ Qcmd}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

403 client=client, 

404 app_id=app.id, 

405 archive_size_bytes=archive_size, 

406 ) 

407 except ArchiveTooLargeError as e: 2~cadddedfdgdhdidbdcdjdkdldmd

408 toolkit.fail( 2~cadddedfdgdhdidbdcdjdkdldmd

409 "invalid_input", 

410 str(e), 

411 hint=( 

412 "You can exclude files from the deployment " 

413 "with a .fastapicloudignore file." 

414 ), 

415 ) 

416 

417 try: 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

418 progress.log( 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

419 f"Deployment created successfully! Deployment slug: {deployment.slug}" 

420 ) 

421 

422 deployment = _upload_deployment( 2YbJ ZbK qbrbsb6 a 4 tb]ccb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb4cP 5cQ 3b4b5b, c ' 6b_cgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b9cS !cT -b.b/b: d ( :b`chb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~b'cV (cW acbccc@ e ) dc{cib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcrcM scN HbIbJb! b 5 Kb^cdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXb,cY -cZ wcxcyc_ f * zc|cjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc;c1 =c2 NcOcPc} g + Qc}ckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

423 fastapi_client=client, 

424 deployment_id=deployment.id, 

425 archive_path=archive_path, 

426 archive_size=archive_size, 

427 progress=progress, 

428 ) 

429 

430 progress.log("Deployment uploaded successfully!") 2J K qbrbsb6 a 4 tbcb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbP Q 3b4b5b, c ' 6bgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,bS T -b.b/b: d ( :bhb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bV W acbccc@ e ) dcib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcM N HbIbJb! b 5 KbdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbY Z wcxcyc_ f * zcjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc1 2 NcOcPc} g + Qckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

431 except KeyboardInterrupt: 2YbZb]c4c5c_c9c!c`c'c(c{crcsc^c,c-c|c;c=c}c

432 _cancel_upload(client=client, deployment_id=deployment.id) 2YbZb4c5c9c!c'c(crcsc,c-c;c=c

433 raise 2YbZb4c5c9c!c'c(crcsc,c-c;c=c

434 

435 if will_wait: 2J K qbrbsb6 a 4 tbcb0b1b2bebL 7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGbP Q 3b4b5b, c ' 6bgb6c7c8clbR - . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,bS T -b.b/b: d ( :bhb#c$c%cmbU ; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bV W acbccc@ e ) dcib)c*c+cnbX [ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcM N HbIbJb! b 5 KbdbtcucvcfbO # $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbY Z wcxcyc_ f * zcjb.c/c:cob0 ` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMc1 2 NcOcPc} g + Qckb?c@c[cpb3 ~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

436 logger.debug("Waiting for deployment to complete") 2qbrbsb6 tbcb0b1b2b7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb3b4b5b, 6bgb6c7c8c- . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b-b.b/b: :bhb#c$c%c; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bacbccc@ dcib)c*c+c[ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcHbIbJb! Kbdbtcucvc# $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbwcxcyc_ zcjb.c/c:c` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMcNcOcPc} Qckb?c@c[c~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

437 _wait_for_deployment( 2qbrbsb6 tbcb0b1b2b7 8 ubvbj k wbh l xbybzbAbBbCbDb9 EbFbGb3b4b5b, 6bgb6c7c8c- . 7b8bu v 9bm w !b#b$b%b'b(b)b/ *b+b,b-b.b/b: :bhb#c$c%c; = ;b=bx y ?bn z @b[b]b^b_b`b{b? |b}b~bacbccc@ dcib)c*c+c[ ] ecfcA B gco C hcicjckclcmcnc^ ocpcqcHbIbJb! Kbdbtcucvc# $ LbMbp q Nbi r ObPbQbRbSbTbUb% VbWbXbwcxcyc_ zcjb.c/c:c` { AcBcD E Ccs F DcEcFcGcHcIcJc| KcLcMcNcOcPc} Qckb?c@c[c~ abRcScG H Tct I UcVcWcXcYcZc0cbb1c2c3c

438 toolkit=toolkit, 

439 client=client, 

440 app_id=app.id, 

441 deployment=deployment, 

442 ) 

443 else: 

444 toolkit.print_line() 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3

445 logger.debug("Skipping deployment wait as requested") 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3

446 if json_output: 2J K a 4 ebL P Q c ' lbR S T d ( mbU V W e ) nbX M N b 5 fbO Y Z f * ob0 1 2 g + pb3

447 toolkit.success( 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb

448 _get_deploy_output(deployment), 

449 warnings=warnings, 

450 hint=( 

451 "Check deployment status in the FastAPI Cloud dashboard: " 

452 f"{deployment.dashboard_url}" 

453 ), 

454 ) 

455 return 2a 4 ebc ' lbd ( mbe ) nbb 5 fbf * obg + pb

456 

457 toolkit.print( 1JKLPQRSTUVWXMNOYZ0123

458 f"Check the status of your deployment at [link={deployment.dashboard_url}]{deployment.dashboard_url}[/link]" 

459 )