Coverage for src/fastapi_cli/utils/cli.py: 100%

64 statements  

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

1import logging 1CDEFGHIJKLMNOP

2import sys 1CDEFGHIJKLMNOP

3from typing import Any 1CDEFGHIJKLMNOP

4 

5from rich._loop import loop_first 1CDEFGHIJKLMNOP

6from rich.console import Console, ConsoleOptions, RenderableType, RenderResult 1CDEFGHIJKLMNOP

7from rich.segment import Segment 1CDEFGHIJKLMNOP

8from rich.text import Text 1CDEFGHIJKLMNOP

9from rich_toolkit import RichToolkit 1CDEFGHIJKLMNOP

10from rich_toolkit.element import Element 1CDEFGHIJKLMNOP

11from rich_toolkit.styles import BaseStyle 1CDEFGHIJKLMNOP

12from uvicorn.logging import DefaultFormatter 1CDEFGHIJKLMNOP

13 

14logger = logging.getLogger(__name__) 1CDEFGHIJKLMNOP

15 

16 

17def should_use_rich_logs() -> bool: 1CDEFGHIJKLMNOP

18 """Return True when stdout is a TTY and rich logs should be used, False otherwise.""" 

19 return sys.stdout.isatty() 2Q R S TfT U V UfW X Y VfZ 0 1 Wf2 3 4 Xf5 6 7 Yf8 9 ! Zf# $ % 0f' ( ) 1f* + , 2f- . / 3f: ; = 4f? @ [ 5f] ^ _ 6f

20 

21 

22class IndentedBlock: 1CDEFGHIJKLMNOP

23 """Indent a renderable, hanging a prefix (e.g. an emoji bullet) on the 

24 first line and aligning wrapped/extra lines under the text.""" 

25 

26 def __init__( 1CDEFGHIJKLMNOP

27 self, 

28 renderable: RenderableType, 

29 *, 

30 first_prefix: Text, 

31 prefix: Text, 

32 ) -> None: 

33 self.renderable = renderable 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

34 self.first_prefix = first_prefix 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

35 self.prefix = prefix 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

36 

37 # Text renders its `end` ("\n" by default), which would break lines 

38 self.first_prefix.end = "" 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

39 self.prefix.end = "" 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

40 

41 def __rich_console__( 1CDEFGHIJKLMNOP

42 self, console: Console, options: ConsoleOptions 

43 ) -> RenderResult: 

44 prefix_width = max(self.first_prefix.cell_len, self.prefix.cell_len) 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

45 lines = console.render_lines( 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

46 self.renderable, 

47 options.update_width(options.max_width - prefix_width), 

48 pad=False, 

49 ) 

50 

51 new_line = Segment.line() 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

52 

53 for first, line in loop_first(lines): 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

54 if any(segment.text.strip() for segment in line): 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

55 yield from console.render( 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

56 self.first_prefix if first else self.prefix, options 

57 ) 

58 yield from line 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

59 

60 yield new_line 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

61 

62 

63class FastAPIStyle(BaseStyle): 1CDEFGHIJKLMNOP

64 """Uniform left indent with emoji bullets hanging to the left of the text. 

65 

66 ``emoji=`` renders as a bullet in a fixed column; ``bullet=False`` drops 

67 the bullet column and just indents. This is a small, purpose-built subset 

68 of the richer style in fastapi-cloud-cli. 

69 """ 

70 

71 content_padding = 1 1CDEFGHIJKLMNOP

72 emoji_column_width = 3 1CDEFGHIJKLMNOP

73 

74 def render_element( 1CDEFGHIJKLMNOP

75 self, 

76 element: Any, 

77 is_active: bool = False, 

78 done: bool = False, 

79 parent: Element | None = None, 

80 **kwargs: Any, 

81 ) -> RenderableType: 

82 rendered = super().render_element( 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

83 element=element, is_active=is_active, done=done, parent=parent, **kwargs 

84 ) 

85 

86 emoji = kwargs.get("emoji", "") 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

87 

88 if not emoji and not kwargs.get("bullet", True): 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

89 indent = Text(" " * (self.content_padding + 1)) 2` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobwepbQ R S qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbxeKbT U V LbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4bye5bW X Y 6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=bze?bZ 0 1 @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjcAekc2 3 4 lcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcBeFc5 6 7 GcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcCe0c8 9 ! 1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-cDe.c# $ % /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedEefd' ( ) gdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdFeAd* + , BdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdGeVd- . / WdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(dHe)d: ; = *d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~dIeae? @ [ becedeeefegeheiejekelemeneoepeqereseteueJeve] ^ _

90 return IndentedBlock(rendered, first_prefix=indent, prefix=indent) 2` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobwepbQ R S qbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbxeKbT U V LbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4bye5bW X Y 6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=bze?bZ 0 1 @b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjcAekc2 3 4 lcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcBeFc5 6 7 GcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZcCe0c8 9 ! 1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-cDe.c# $ % /c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedEefd' ( ) gdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdFeAd* + , BdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdGeVd- . / WdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(dHe)d: ; = *d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~dIeae? @ [ becedeeefegeheiejekelemeneoepeqereseteueJeve] ^ _

91 

92 return IndentedBlock( 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

93 rendered, 

94 first_prefix=self._get_bullet_prefix(emoji), 

95 prefix=Text(" " * (self.content_padding + self.emoji_column_width)), 

96 ) 

97 

98 def _get_bullet_prefix(self, emoji: str) -> Text: 1CDEFGHIJKLMNOP

99 prefix = Text(" " * self.content_padding) 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

100 

101 if emoji: 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

102 prefix.append_text(Text.from_markup(emoji)) 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

103 

104 prefix.pad_right( 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

105 self.content_padding + self.emoji_column_width - prefix.cell_len 

106 ) 

107 

108 return prefix 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a qbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b LbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c 6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d @b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e lcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f GcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g 1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h /c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i gdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j BdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k WdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l *d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m becedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n

109 

110 

111LOG_LEVEL_COLORS = { 1CDEFGHIJKLMNOP

112 "debug": "blue", 

113 "info": "cyan", 

114 "warning": "yellow", 

115 "warn": "yellow", 

116 "error": "red", 

117 "critical": "magenta", 

118 "fatal": "magenta", 

119} 

120 

121 

122def _get_log_bullet(level: str) -> str: 1CDEFGHIJKLMNOP

123 """Colored bar rendered in the emoji bullet column, matching the log 

124 level, like the ``fastapi cloud logs`` output.""" 

125 color = LOG_LEVEL_COLORS.get(level.lower(), "dim") 1oapbqcrdsetfugvhwixjykzlAmBn

126 

127 return f"[{color}]▕[/{color}]" 1oapbqcrdsetfugvhwixjykzlAmBn

128 

129 

130class CustomFormatter(DefaultFormatter): 1CDEFGHIJKLMNOP

131 def __init__(self, *args: Any, **kwargs: Any) -> None: 1CDEFGHIJKLMNOP

132 super().__init__(*args, **kwargs) 2o a Ffp b Gfq c Hfr d Ifs e Jft f Kfu g Lfv h Mfw i Nfx j Ofy k Pfz l QfA m RfB n Sf

133 self.toolkit = get_rich_toolkit() 2o a Ffp b Gfq c Hfr d Ifs e Jft f Kfu g Lfv h Mfw i Nfx j Ofy k Pfz l QfA m RfB n Sf

134 

135 def formatMessage(self, record: logging.LogRecord) -> str: 1CDEFGHIJKLMNOP

136 message = record.getMessage() 1oapbqcrdsetfugvhwixjykzlAmBn

137 result = self.toolkit.print_as_string( 1oapbqcrdsetfugvhwixjykzlAmBn

138 message, emoji=_get_log_bullet(record.levelname) 

139 ) 

140 # Prepend newline to fix alignment after ^C is printed by the terminal 

141 if message == "Shutting down": 1oapbqcrdsetfugvhwixjykzlAmBn

142 result = "\n" + result 1abcdefghijklmn

143 return result 1oapbqcrdsetfugvhwixjykzlAmBn

144 

145 

146def get_uvicorn_log_config() -> dict[str, Any]: 1CDEFGHIJKLMNOP

147 return { 2` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpb7fFfqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKb8fGfLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b9fHf6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b!fIf@b[b]b^b_b`b{b|b}b~bacbcccdcecfcgchcicjckc#fJflcmcncocpcqcrcsctcucvcwcxcyczcAcBcCcDcEcFc$fKfGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c%fLf1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)c*c+c,c-c.c'fMf/c:c;c=c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfd(fNfgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAd)fOfBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVd*fPfWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d+fQf*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~dae,fRfbecedeeefegeheiejekelemeneoepeqereseteueve-fSf

148 "version": 1, 

149 "disable_existing_loggers": False, 

150 "formatters": { 

151 "default": { 

152 "()": CustomFormatter, 

153 "fmt": "%(levelprefix)s %(message)s", 

154 "use_colors": None, 

155 }, 

156 "access": { 

157 "()": CustomFormatter, 

158 "fmt": "%(levelprefix)s %(client_addr)s - '%(request_line)s' %(status_code)s", 

159 }, 

160 }, 

161 "handlers": { 

162 "default": { 

163 "formatter": "default", 

164 "class": "logging.StreamHandler", 

165 "stream": "ext://sys.stderr", 

166 }, 

167 "access": { 

168 "formatter": "access", 

169 "class": "logging.StreamHandler", 

170 "stream": "ext://sys.stdout", 

171 }, 

172 }, 

173 "loggers": { 

174 "uvicorn": { 

175 "handlers": ["default"], 

176 "level": "INFO", 

177 "propagate": False, 

178 }, 

179 "uvicorn.error": {"level": "INFO"}, 

180 "uvicorn.access": { 

181 "handlers": ["access"], 

182 "level": "INFO", 

183 "propagate": False, 

184 }, 

185 }, 

186 } 

187 

188 

189def get_rich_toolkit() -> RichToolkit: 1CDEFGHIJKLMNOP

190 return RichToolkit(style=FastAPIStyle()) 2` { | } ~ abbbcbdbebfbgbKeLehbibjbkblbmbnbMeobwepbQ R NeOeS Peo a FfqbrbsbtbubvbwbxbybzbAbBbQeReCbDbEbFbGbHbIbSeJbxeKbT U TeUeV Vep b GfLbMbNbObPbQbRbSbTbUbVbWbWeXeXbYbZb0b1b2b3bYe4bye5bW X Ze0eY 1eq c Hf6b7b8b9b!b#b$b%b'b(b)b*b2e3e+b,b-b.b/b:b;b4e=bze?bZ 0 5e6e1 7er d If@b[b]b^b_b`b{b|b}b~bacbc8e9eccdcecfcgchcic!ejcAekc2 3 #e$e4 %es e Jflcmcncocpcqcrcsctcucvcwc'e(excyczcAcBcCcDc)eEcBeFc5 6 *e+e7 ,et f KfGcHcIcJcKcLcMcNcOcPcQcRc-e.eScTcUcVcWcXcYc/eZcCe0c8 9 :e;e! =eu g Lf1c2c3c4c5c6c7c8c9c!c#c$c?e@e%c'c(c)c*c+c,c[e-cDe.c# $ ]e^e% _ev h Mf/c:c;c=c?c@c[c]c^c_c`c{c`e{e|c}c~cadbdcddd|eedEefd' ( }e~e) afw i NfgdhdidjdkdldmdndodpdqdrdbfcfsdtdudvdwdxdyddfzdFeAd* + efff, gfx j OfBdCdDdEdFdGdHdIdJdKdLdMdhfifNdOdPdQdRdSdTdjfUdGeVd- . kflf/ mfy k PfWdXdYdZd0d1d2d3d4d5d6d7dnfof8d9d!d#d$d%d'dpf(dHe)d: ; qfrf= sfz l Qf*d+d,d-d.d/d:d;d=d?d@d[dtfuf]d^d_d`d{d|d}dvf~dIeae? @ wfxf[ yfA m RfbecedeeefegeheiejekelemezfAfneoepeqereseteBfueJeve] ^ CfDf_ EfB n Sf