From 08b18b7ff60e5da970e8d259afae88aa878aba7b Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 07:16:27 +0100 Subject: [PATCH 1/6] feat: add print_version_info function part of #11222 --- freqtrade/system/__init__.py | 3 ++- freqtrade/system/version_info.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 freqtrade/system/version_info.py diff --git a/freqtrade/system/__init__.py b/freqtrade/system/__init__.py index 10a23aa4b86..e69e90de8eb 100644 --- a/freqtrade/system/__init__.py +++ b/freqtrade/system/__init__.py @@ -2,6 +2,7 @@ from freqtrade.system.asyncio_config import asyncio_setup from freqtrade.system.gc_setup import gc_set_threshold +from freqtrade.system.version_info import print_version_info -__all__ = ["asyncio_setup", "gc_set_threshold"] +__all__ = ["asyncio_setup", "gc_set_threshold", "print_version_info"] diff --git a/freqtrade/system/version_info.py b/freqtrade/system/version_info.py new file mode 100644 index 00000000000..52624460f72 --- /dev/null +++ b/freqtrade/system/version_info.py @@ -0,0 +1,15 @@ +from freqtrade import __version__ + + +def print_version_info(): + """Print version information for freqtrade and its key dependencies.""" + import platform + import sys + + import ccxt + + print(f"Operating System: \t{platform.platform()}") + print(f"Python Version: \tPython {sys.version.split(' ')[0]}") + print(f"CCXT Version: \t\t{ccxt.__version__}") + print() + print(f"Freqtrade Version:\tfreqtrade {__version__}") From 27a9cbf5e4bc289ac2e1daf694dde3c8ff967071 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 07:17:36 +0100 Subject: [PATCH 2/6] feat: print version info on "-V" calls closes #11222 --- freqtrade/commands/arguments.py | 2 +- freqtrade/commands/cli_options.py | 9 +++++++-- freqtrade/main.py | 7 +++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/freqtrade/commands/arguments.py b/freqtrade/commands/arguments.py index 432bf429924..d0bad456797 100755 --- a/freqtrade/commands/arguments.py +++ b/freqtrade/commands/arguments.py @@ -347,7 +347,7 @@ def _build_subcommands(self) -> None: self.parser = ArgumentParser( prog="freqtrade", description="Free, open source crypto trading bot" ) - self._build_args(optionlist=["version"], parser=self.parser) + self._build_args(optionlist=["version_main"], parser=self.parser) from freqtrade.commands import ( start_analysis_entries_exits, diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 54cd56e52aa..5dab923f30c 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -59,8 +59,13 @@ def __init__(self, *args, **kwargs): "version": Arg( "-V", "--version", - action="version", - version=f"%(prog)s {__version__}", + action="store_true", + ), + "version_main": Arg( + # Copy of version - used to have -V available with and without subcommand. + "-V", + "--version", + action="store_true", ), "config": Arg( "-c", diff --git a/freqtrade/main.py b/freqtrade/main.py index bd815b74652..d4aab346825 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -18,7 +18,7 @@ from freqtrade.constants import DOCS_LINK from freqtrade.exceptions import ConfigurationError, FreqtradeException, OperationalException from freqtrade.loggers import setup_logging_pre -from freqtrade.system import asyncio_setup, gc_set_threshold +from freqtrade.system import asyncio_setup, gc_set_threshold, print_version_info logger = logging.getLogger("freqtrade") @@ -38,7 +38,10 @@ def main(sysargv: list[str] | None = None) -> None: args = arguments.get_parsed_arg() # Call subcommand. - if "func" in args: + if args.get("version") or args.get("version_main"): + print_version_info() + return_code = 0 + elif "func" in args: logger.info(f"freqtrade {__version__}") gc_set_threshold() return_code = args["func"](args) From 120194ff1e9195d18b7a3953ffa84fe23a5ad6b1 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 19:25:58 +0100 Subject: [PATCH 3/6] chore: improved formatting --- freqtrade/system/version_info.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freqtrade/system/version_info.py b/freqtrade/system/version_info.py index 52624460f72..505992a7fd3 100644 --- a/freqtrade/system/version_info.py +++ b/freqtrade/system/version_info.py @@ -8,8 +8,8 @@ def print_version_info(): import ccxt - print(f"Operating System: \t{platform.platform()}") - print(f"Python Version: \tPython {sys.version.split(' ')[0]}") - print(f"CCXT Version: \t\t{ccxt.__version__}") + print(f"Operating System:\t{platform.platform()}") + print(f"Python Version:\t\tPython {sys.version.split(' ')[0]}") + print(f"CCXT Version:\t\t{ccxt.__version__}") print() print(f"Freqtrade Version:\tfreqtrade {__version__}") From d843216343c6eac540644f270e2d2d457ae24a09 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 19:39:34 +0100 Subject: [PATCH 4/6] test: update tests for new --version handling --- tests/test_arguments.py | 4 ++-- tests/test_main.py | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/test_arguments.py b/tests/test_arguments.py index 499b194a2c3..1d48acb96d0 100644 --- a/tests/test_arguments.py +++ b/tests/test_arguments.py @@ -82,8 +82,8 @@ def test_common_scripts_options() -> None: def test_parse_args_version() -> None: - with pytest.raises(SystemExit, match=r"0"): - Arguments(["--version"]).get_parsed_arg() + args = Arguments(["--version"]).get_parsed_arg() + assert args["version_main"] is True def test_parse_args_invalid() -> None: diff --git a/tests/test_main.py b/tests/test_main.py index 54b00a7d838..0551def2d6b 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -1,5 +1,6 @@ # pragma pylint: disable=missing-docstring +import re from copy import deepcopy from pathlib import Path from unittest.mock import MagicMock, PropertyMock @@ -26,6 +27,14 @@ def test_parse_args_None(caplog) -> None: assert log_has_re(r"Usage of Freqtrade requires a subcommand.*", caplog) +def test_parse_args_version(capsys) -> None: + with pytest.raises(SystemExit): + main(["-V"]) + captured = capsys.readouterr() + assert re.search(r"CCXT Version:\s.*", captured.out, re.MULTILINE) + assert re.search(r"Freqtrade Version:\s+freqtrade\s.*", captured.out, re.MULTILINE) + + def test_parse_args_backtesting(mocker) -> None: """ Test that main() can start backtesting and also ensure we can pass some specific arguments From 7e08828537d2263ceb7a6be39cba5efbfdb85162 Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 19:43:51 +0100 Subject: [PATCH 5/6] chore: Remove unused import --- freqtrade/commands/cli_options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 5dab923f30c..1ecf0b1d60b 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -4,7 +4,7 @@ from argparse import SUPPRESS, ArgumentTypeError -from freqtrade import __version__, constants +from freqtrade import constants from freqtrade.constants import HYPEROPT_LOSS_BUILTIN from freqtrade.enums import CandleType From 63b72fb4eb49dbf19bcddf158b78102dab22ce5d Mon Sep 17 00:00:00 2001 From: Matthias Date: Fri, 24 Jan 2025 20:01:10 +0100 Subject: [PATCH 6/6] chore: add help-text to --version --- freqtrade/commands/cli_options.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/freqtrade/commands/cli_options.py b/freqtrade/commands/cli_options.py index 1ecf0b1d60b..16f5d1c4d97 100755 --- a/freqtrade/commands/cli_options.py +++ b/freqtrade/commands/cli_options.py @@ -59,12 +59,14 @@ def __init__(self, *args, **kwargs): "version": Arg( "-V", "--version", + help="show program's version number and exit", action="store_true", ), "version_main": Arg( # Copy of version - used to have -V available with and without subcommand. "-V", "--version", + help="show program's version number and exit", action="store_true", ), "config": Arg(