diff --git a/freqtrade/commands/list_commands.py b/freqtrade/commands/list_commands.py index 0784e5134..846b97693 100644 --- a/freqtrade/commands/list_commands.py +++ b/freqtrade/commands/list_commands.py @@ -17,11 +17,11 @@ def start_list_exchanges(args: dict[str, Any]) -> None: :param args: Cli args from Arguments() :return: None """ - from rich.console import Console from rich.table import Table from rich.text import Text from freqtrade.exchange import list_available_exchanges + from freqtrade.loggers.rich_console import get_rich_console available_exchanges: list[ValidExchangesType] = list_available_exchanges( args["list_exchanges_all"] @@ -77,15 +77,16 @@ def start_list_exchanges(args: dict[str, Any]) -> None: ) # table.add_row(*[exchange[header] for header in headers]) - console = Console() + console = get_rich_console() console.print(table) def _print_objs_tabular(objs: list, print_colorized: bool) -> None: - from rich.console import Console from rich.table import Table from rich.text import Text + from freqtrade.loggers.rich_console import get_rich_console + names = [s["name"] for s in objs] objs_to_print: list[dict[str, Text | str]] = [ { @@ -118,10 +119,7 @@ def _print_objs_tabular(objs: list, print_colorized: bool) -> None: for row in objs_to_print: table.add_row(*[row[header] for header in objs_to_print[0].keys()]) - console = Console( - color_system="auto" if print_colorized else None, - width=200 if "pytest" in sys.modules else None, - ) + console = get_rich_console(color_system="auto" if print_colorized else None) console.print(table) diff --git a/freqtrade/loggers/__init__.py b/freqtrade/loggers/__init__.py index 69e372a29..1d01d4177 100644 --- a/freqtrade/loggers/__init__.py +++ b/freqtrade/loggers/__init__.py @@ -3,12 +3,11 @@ from logging import Formatter from logging.handlers import RotatingFileHandler, SysLogHandler from pathlib import Path -from rich.console import Console - from freqtrade.constants import Config from freqtrade.exceptions import OperationalException from freqtrade.loggers.buffering_handler import FTBufferingHandler from freqtrade.loggers.ft_rich_handler import FtRichHandler +from freqtrade.loggers.rich_console import get_rich_console from freqtrade.loggers.set_log_levels import set_loggers @@ -22,7 +21,8 @@ LOGFORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" bufferHandler = FTBufferingHandler(1000) bufferHandler.setFormatter(Formatter(LOGFORMAT)) -error_console = Console(stderr=True, color_system=None) + +error_console = get_rich_console(stderr=True, color_system=None) def get_existing_handlers(handlertype): diff --git a/freqtrade/loggers/rich_console.py b/freqtrade/loggers/rich_console.py new file mode 100644 index 000000000..f3ecd5556 --- /dev/null +++ b/freqtrade/loggers/rich_console.py @@ -0,0 +1,26 @@ +import sys +from shutil import get_terminal_size + +from rich.console import Console + + +def console_width() -> int | None: + """ + Get the width of the console + """ + if any(module in ["pytest", "ipykernel"] for module in sys.modules): + return 200 + + width, _ = get_terminal_size((1, 24)) + # Fall back to 200 if terminal size is not available. + # This is determined by assuming an insane width of 1char, which is unlikely. + w = None if width > 1 else 200 + return w + + +def get_rich_console(**kwargs) -> Console: + """ + Get a rich console with default settings + """ + kwargs["width"] = kwargs.get("width", console_width()) + return Console(**kwargs) diff --git a/freqtrade/util/progress_tracker.py b/freqtrade/util/progress_tracker.py index cc5c79a18..aac1418bc 100644 --- a/freqtrade/util/progress_tracker.py +++ b/freqtrade/util/progress_tracker.py @@ -7,7 +7,6 @@ from rich.progress import ( TimeRemainingColumn, ) -from freqtrade.loggers import error_console from freqtrade.util.rich_progress import CustomProgress @@ -21,6 +20,8 @@ def get_progress_tracker(**kwargs) -> CustomProgress: """ Get progress Bar with custom columns. """ + from freqtrade.loggers import error_console + return CustomProgress( TextColumn("[progress.description]{task.description}"), BarColumn(bar_width=None), diff --git a/freqtrade/util/rich_tables.py b/freqtrade/util/rich_tables.py index ba232ed75..093c73584 100644 --- a/freqtrade/util/rich_tables.py +++ b/freqtrade/util/rich_tables.py @@ -1,12 +1,12 @@ -import sys from collections.abc import Sequence from typing import Any, TypeAlias from pandas import DataFrame -from rich.console import Console from rich.table import Column, Table from rich.text import Text +from freqtrade.loggers.rich_console import get_rich_console + TextOrString: TypeAlias = str | Text @@ -38,11 +38,7 @@ def print_rich_table( row_to_add: list[str | Text] = [r if isinstance(r, Text) else str(r) for r in row] table.add_row(*row_to_add) - width = None - if any(module in ["pytest", "ipykernel"] for module in sys.modules): - width = 200 - - console = Console(width=width) + console = get_rich_console() console.print(table) @@ -74,9 +70,5 @@ def print_df_rich_table( row = [_format_value(x, floatfmt=".3f") for x in value_list] table.add_row(*row) - width = None - if any(module in ["pytest", "ipykernel"] for module in sys.modules): - width = 200 - - console = Console(width=width) + console = get_rich_console() console.print(table)