From 86381955a3ebedbdf37b17bf0af4bcf4866bea48 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 28 Oct 2025 20:40:18 +0100 Subject: [PATCH 1/3] feat: use text-analysis to short-circuit strategy loading --- freqtrade/resolvers/iresolver.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/freqtrade/resolvers/iresolver.py b/freqtrade/resolvers/iresolver.py index 6807b757d..43ca2d861 100644 --- a/freqtrade/resolvers/iresolver.py +++ b/freqtrade/resolvers/iresolver.py @@ -148,6 +148,9 @@ class IResolver: logger.debug("Ignoring broken symlink %s", entry) continue module_path = entry.resolve() + if entry.read_text().find(f"class {object_name}(") == -1: + logger.debug(f"Skipping {module_path} as it does not contain class {object_name}") + continue if obj := next(cls._get_valid_object(module_path, object_name), None): obj[0].__file__ = str(entry) From 635af046bf8ad5bafe32ffc57b8470b5aebcfa29 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 28 Oct 2025 20:45:18 +0100 Subject: [PATCH 2/3] test: add test for string loading skipping --- tests/strategy/test_strategy_loading.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/strategy/test_strategy_loading.py b/tests/strategy/test_strategy_loading.py index 923f3635b..80ff025fb 100644 --- a/tests/strategy/test_strategy_loading.py +++ b/tests/strategy/test_strategy_loading.py @@ -96,6 +96,16 @@ def test_load_strategy_invalid_directory(caplog, default_conf, tmp_path): assert log_has_re(r"Path .*" + r"some.*path.*" + r".* does not exist", caplog) +def test_load_strategy_skip_other_files(caplog, default_conf, tmp_path): + default_conf["user_data_dir"] = tmp_path + caplog.set_level(logging.DEBUG) + + s = StrategyResolver._load_strategy("StrategyTestV3", config=default_conf) + assert isinstance(s, IStrategy) + + assert log_has_re(r"Skipping .* as it does not contain class StrategyTestV3\.", caplog) + + def test_load_not_found_strategy(default_conf, tmp_path): default_conf["user_data_dir"] = tmp_path default_conf["strategy"] = "NotFoundStrategy" From db63d433f74cb549afd97342aabe0ee5184f955c Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 28 Oct 2025 20:47:22 +0100 Subject: [PATCH 3/3] chore: improve log message --- freqtrade/resolvers/iresolver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freqtrade/resolvers/iresolver.py b/freqtrade/resolvers/iresolver.py index 43ca2d861..b437166e7 100644 --- a/freqtrade/resolvers/iresolver.py +++ b/freqtrade/resolvers/iresolver.py @@ -149,7 +149,7 @@ class IResolver: continue module_path = entry.resolve() if entry.read_text().find(f"class {object_name}(") == -1: - logger.debug(f"Skipping {module_path} as it does not contain class {object_name}") + logger.debug(f"Skipping {module_path} as it does not contain class {object_name}.") continue if obj := next(cls._get_valid_object(module_path, object_name), None):