From 8e1e7640c42530e4ccf5f86d853ddfb29f7981a2 Mon Sep 17 00:00:00 2001 From: Jvst Me Date: Mon, 29 Sep 2025 12:53:14 +0200 Subject: [PATCH] Move `USER` to `dstack project list --verbose` Only show the `USER` column in `dstack project list` if `--verbose` is passed. In my setup, where 9 projects are configured, this speeds up `dstack project list` from 20 seconds to 2 seconds. --- src/dstack/_internal/cli/commands/project.py | 47 +++++++++++--------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/src/dstack/_internal/cli/commands/project.py b/src/dstack/_internal/cli/commands/project.py index edcc067097..0f6e5b4db5 100644 --- a/src/dstack/_internal/cli/commands/project.py +++ b/src/dstack/_internal/cli/commands/project.py @@ -1,11 +1,12 @@ import argparse +from typing import Any, Union from requests import HTTPError from rich.table import Table import dstack.api.server from dstack._internal.cli.commands import BaseCommand -from dstack._internal.cli.utils.common import confirm_ask, console +from dstack._internal.cli.utils.common import add_row_from_dict, confirm_ask, console from dstack._internal.core.errors import ClientError, CLIError from dstack._internal.core.services.configs import ConfigManager from dstack._internal.utils.logging import get_logger @@ -58,6 +59,10 @@ def _register(self): # List subcommand list_parser = subparsers.add_parser("list", help="List configured projects") list_parser.set_defaults(subfunc=self._list) + for parser in [self._parser, list_parser]: + parser.add_argument( + "-v", "--verbose", action="store_true", help="Show more information" + ) # Set default subcommand set_default_parser = subparsers.add_parser("set-default", help="Set default project") @@ -122,30 +127,32 @@ def _list(self, args: argparse.Namespace): table = Table(box=None) table.add_column("PROJECT", style="bold", no_wrap=True) table.add_column("URL", style="grey58") - table.add_column("USER", style="grey58") + if args.verbose: + table.add_column("USER", style="grey58") table.add_column("DEFAULT", justify="center") for project_config in config_manager.list_project_configs(): project_name = project_config.name is_default = project_name == default_project.name if default_project else False - - # Get username from API - try: - api_client = dstack.api.server.APIClient( - base_url=project_config.url, token=project_config.token - ) - user_info = api_client.users.get_my_user() - username = user_info.username - except ClientError: - username = "(invalid token)" - - table.add_row( - project_name, - project_config.url, - username, - "✓" if is_default else "", - style="bold" if is_default else None, - ) + row: dict[Union[str, int], Any] = { + "PROJECT": project_name, + "URL": project_config.url, + "DEFAULT": "✓" if is_default else "", + } + + if args.verbose: + # Get username from API + try: + api_client = dstack.api.server.APIClient( + base_url=project_config.url, token=project_config.token + ) + user_info = api_client.users.get_my_user() + username = user_info.username + except ClientError: + username = "(invalid token)" + row["USER"] = username + + add_row_from_dict(table, row, style="bold" if is_default else None) console.print(table)