Coverage for src/fastapi_cloud_cli/commands/env/list.py: 100%

43 statements  

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

1from pathlib import Path 1abcdefg

2from typing import Annotated, Any 1abcdefg

3 

4import typer 1abcdefg

5from pydantic import BaseModel 1abcdefg

6from rich.table import Table 1abcdefg

7from rich.text import Text 1abcdefg

8from rich_toolkit import RichToolkit 1abcdefg

9 

10from fastapi_cloud_cli.api import APIClient, EnvironmentVariable 1abcdefg

11from fastapi_cloud_cli.commands._auth import UserCommand, get_user_command_context 1abcdefg

12from fastapi_cloud_cli.commands.env._app import env_app 1abcdefg

13from fastapi_cloud_cli.commands.env._shared import ( 1abcdefg

14 ENV_VAR_VALUE_MAX_LENGTH, 

15 _format_env_var_value, 

16) 

17from fastapi_cloud_cli.utils.apps import resolve_app_id_or_fail 1abcdefg

18from fastapi_cloud_cli.utils.dates import format_last_updated 1abcdefg

19from fastapi_cloud_cli.utils.execution import JsonOutputOption 1abcdefg

20 

21 

22class EnvironmentVariablesListOutput(BaseModel): 1abcdefg

23 app_id: str 1abcdefg

24 variables: list[EnvironmentVariable] 1abcdefg

25 

26 

27def _get_environment_variables_table( 1abcdefg

28 environment_variables: list[EnvironmentVariable], 

29) -> Table: 

30 table = Table.grid(padding=(0, 2), pad_edge=False) 1hijklmnopqrstuvwxyzABCDEFGHI

31 table.add_column("Key", no_wrap=True) 1hijklmnopqrstuvwxyzABCDEFGHI

32 table.add_column("Value", overflow="ellipsis", max_width=ENV_VAR_VALUE_MAX_LENGTH) 1hijklmnopqrstuvwxyzABCDEFGHI

33 table.add_column("Last updated", style="dim", no_wrap=True) 1hijklmnopqrstuvwxyzABCDEFGHI

34 table.add_row("[bold]Key[/bold]", "[bold]Value[/bold]", "[bold]Last updated[/bold]") 1hijklmnopqrstuvwxyzABCDEFGHI

35 table.add_row("", "", "") 1hijklmnopqrstuvwxyzABCDEFGHI

36 

37 for env_var in environment_variables: 1hijklmnopqrstuvwxyzABCDEFGHI

38 table.add_row( 1hijklmnopqrstuvwxyzABCDEFGHI

39 Text(env_var.name), 

40 _format_env_var_value(env_var), 

41 Text(format_last_updated(env_var.updated_at)), 

42 ) 

43 

44 return table 1hijklmnopqrstuvwxyzABCDEFGHI

45 

46 

47def _render_environment_variables_list_output( 1abJcdKefgL

48 data: EnvironmentVariablesListOutput, toolkit: RichToolkit 

49) -> None: 

50 toolkit.print_title("environment variables") 1MhijkJlmnoNpqrsKtuvwOxyzAPBCDELFGHI

51 toolkit.print_line() 1MhijkJlmnoNpqrsKtuvwOxyzAPBCDELFGHI

52 

53 if not data.variables: 1MhijkJlmnoNpqrsKtuvwOxyzAPBCDELFGHI

54 toolkit.print("No environment variables found.", bullet=False) 1MJNKOPL

55 return 1MJNKOPL

56 

57 toolkit.print(_get_environment_variables_table(data.variables), bullet=False) 1hijklmnopqrstuvwxyzABCDEFGHI

58 

59 

60@env_app.command("list", cls=UserCommand) 1abcdefg

61def list_variables( 1ab=cd?efg@

62 ctx: typer.Context, 

63 path: Annotated[ 

64 Path | None, 

65 typer.Option( 

66 "--path", 

67 help=( 

68 "Path to the directory with your app's pyproject.toml " 

69 "(defaults to current directory)" 

70 ), 

71 ), 

72 ] = None, 

73 app_id: Annotated[ 

74 str | None, 

75 typer.Option( 

76 "--app-id", 

77 help="ID of the app whose environment variables should be listed.", 

78 ), 

79 ] = None, 

80 json_output: JsonOutputOption = False, 

81) -> Any: 

82 """ 

83 List the environment variables for the app. 

84 """ 

85 

86 toolkit = get_user_command_context(ctx).toolkit 1#QR$M4hijk%ST'J5lmno(UV)N6pqrs*WX+K7tuvw,YZ-O8xyzA.01/P9BCDE:23;L!FGHI

87 

88 target_app_id = resolve_app_id_or_fail(toolkit, app_id=app_id, path=path) 1#QR$M4hijk%ST'J5lmno(UV)N6pqrs*WX+K7tuvw,YZ-O8xyzA.01/P9BCDE:23;L!FGHI

89 

90 with APIClient() as client: 1QRM4hijkSTJ5lmnoUVN6pqrsWXK7tuvwYZO8xyzA01P9BCDE23L!FGHI

91 with toolkit.progress( 1QRM4hijkSTJ5lmnoUVN6pqrsWXK7tuvwYZO8xyzA01P9BCDE23L!FGHI

92 "Fetching environment variables...", transient=True 

93 ) as progress: 

94 with client.handle_http_errors(progress): 1QRM4hijkSTJ5lmnoUVN6pqrsWXK7tuvwYZO8xyzA01P9BCDE23L!FGHI

95 environment_variables = client.get_environment_variables( 1QRM4hijkSTJ5lmnoUVN6pqrsWXK7tuvwYZO8xyzA01P9BCDE23L!FGHI

96 app_id=target_app_id 

97 ) 

98 

99 toolkit.success( 1QRMhijkSTJlmnoUVNpqrsWXKtuvwYZOxyzA01PBCDE23LFGHI

100 EnvironmentVariablesListOutput( 

101 app_id=target_app_id, 

102 variables=environment_variables.data, 

103 ), 

104 render_output=_render_environment_variables_list_output, 

105 )