From 56ef3af42415164400a3f24bd1e9b2754e467491 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 6 Apr 2021 11:59:58 +0200 Subject: [PATCH] Allow comments in pairs files --- freqtrade/configuration/configuration.py | 12 +++++------- freqtrade/configuration/load_config.py | 9 +++++++++ freqtrade/misc.py | 2 +- tests/test_configuration.py | 19 ++++++------------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/freqtrade/configuration/configuration.py b/freqtrade/configuration/configuration.py index a40a4fd83..9acd532cc 100644 --- a/freqtrade/configuration/configuration.py +++ b/freqtrade/configuration/configuration.py @@ -11,10 +11,10 @@ from freqtrade import constants from freqtrade.configuration.check_exchange import check_exchange from freqtrade.configuration.deprecated_settings import process_temporary_deprecated_settings from freqtrade.configuration.directory_operations import create_datadir, create_userdata_dir -from freqtrade.configuration.load_config import load_config_file +from freqtrade.configuration.load_config import load_config_file, load_file from freqtrade.exceptions import OperationalException from freqtrade.loggers import setup_logging -from freqtrade.misc import deep_merge_dicts, json_load +from freqtrade.misc import deep_merge_dicts from freqtrade.state import NON_UTIL_MODES, TRADING_MODES, RunMode @@ -454,9 +454,8 @@ class Configuration: # or if pairs file is specified explicitely if not pairs_file.exists(): raise OperationalException(f'No pairs file found with path "{pairs_file}".') - with pairs_file.open('r') as f: - config['pairs'] = json_load(f) - config['pairs'].sort() + config['pairs'] = load_file(pairs_file) + config['pairs'].sort() return if 'config' in self.args and self.args['config']: @@ -466,7 +465,6 @@ class Configuration: # Fall back to /dl_path/pairs.json pairs_file = config['datadir'] / 'pairs.json' if pairs_file.exists(): - with pairs_file.open('r') as f: - config['pairs'] = json_load(f) + config['pairs'] = load_file(pairs_file) if 'pairs' in config: config['pairs'].sort() diff --git a/freqtrade/configuration/load_config.py b/freqtrade/configuration/load_config.py index 726126034..1320a375f 100644 --- a/freqtrade/configuration/load_config.py +++ b/freqtrade/configuration/load_config.py @@ -38,6 +38,15 @@ def log_config_error_range(path: str, errmsg: str) -> str: return '' +def load_file(path: Path) -> Dict[str, Any]: + try: + with path.open('r') as file: + config = rapidjson.load(file, parse_mode=CONFIG_PARSE_MODE) + except FileNotFoundError: + raise OperationalException(f'File file "{path}" not found!') + return config + + def load_config_file(path: str) -> Dict[str, Any]: """ Loads a config file from the given path diff --git a/freqtrade/misc.py b/freqtrade/misc.py index 7bbc24056..6508363d6 100644 --- a/freqtrade/misc.py +++ b/freqtrade/misc.py @@ -81,7 +81,7 @@ def json_load(datafile: IO) -> Any: """ load data with rapidjson Use this to have a consistent experience, - sete number_mode to "NM_NATIVE" for greatest speed + set number_mode to "NM_NATIVE" for greatest speed """ return rapidjson.load(datafile, number_mode=rapidjson.NM_NATIVE) diff --git a/tests/test_configuration.py b/tests/test_configuration.py index 15fbab7f8..b8d38dce0 100644 --- a/tests/test_configuration.py +++ b/tests/test_configuration.py @@ -1038,37 +1038,30 @@ def test_pairlist_resolving_with_config(mocker, default_conf): def test_pairlist_resolving_with_config_pl(mocker, default_conf): patched_configuration_load_config_file(mocker, default_conf) - load_mock = mocker.patch("freqtrade.configuration.configuration.json_load", - MagicMock(return_value=['XRP/BTC', 'ETH/BTC'])) - mocker.patch.object(Path, "exists", MagicMock(return_value=True)) - mocker.patch.object(Path, "open", MagicMock(return_value=MagicMock())) arglist = [ 'download-data', '--config', 'config.json', - '--pairs-file', 'pairs.json', + '--pairs-file', 'tests/testdata/pairs.json', ] args = Arguments(arglist).get_parsed_arg() configuration = Configuration(args) config = configuration.get_config() - - assert load_mock.call_count == 1 - assert config['pairs'] == ['ETH/BTC', 'XRP/BTC'] + assert len(config['pairs']) == 23 + assert 'ETH/BTC' in config['pairs'] + assert 'XRP/BTC' in config['pairs'] assert config['exchange']['name'] == default_conf['exchange']['name'] def test_pairlist_resolving_with_config_pl_not_exists(mocker, default_conf): patched_configuration_load_config_file(mocker, default_conf) - mocker.patch("freqtrade.configuration.configuration.json_load", - MagicMock(return_value=['XRP/BTC', 'ETH/BTC'])) - mocker.patch.object(Path, "exists", MagicMock(return_value=False)) arglist = [ 'download-data', '--config', 'config.json', - '--pairs-file', 'pairs.json', + '--pairs-file', 'tests/testdata/pairs_doesnotexist.json', ] args = Arguments(arglist).get_parsed_arg() @@ -1081,7 +1074,7 @@ def test_pairlist_resolving_with_config_pl_not_exists(mocker, default_conf): def test_pairlist_resolving_fallback(mocker): mocker.patch.object(Path, "exists", MagicMock(return_value=True)) mocker.patch.object(Path, "open", MagicMock(return_value=MagicMock())) - mocker.patch("freqtrade.configuration.configuration.json_load", + mocker.patch("freqtrade.configuration.configuration.load_file", MagicMock(return_value=['XRP/BTC', 'ETH/BTC'])) arglist = [ 'download-data',