def test_load_config_file_exception(mocker) -> None: mocker.patch('freqtrade.configuration.configuration.open', MagicMock(side_effect=FileNotFoundError('File not found'))) with pytest.raises(OperationalException, match=r'.*Config file "somefile" not found!*'): load_config_file('somefile')
def test_load_config_file_error(default_conf, mocker, caplog) -> None: del default_conf['user_data_dir'] filedata = json.dumps(default_conf).replace( '"stake_amount": 0.001,', '"stake_amount": .001,') mocker.patch('freqtrade.configuration.load_config.open', mocker.mock_open(read_data=filedata)) mocker.patch.object(Path, "read_text", MagicMock(return_value=filedata)) with pytest.raises(OperationalException, match=r".*Please verify the following segment.*"): load_config_file('somefile')
def load_from_files(self, files: List[str]) -> Dict[str, Any]: # Keep this method as staticmethod, so it can be used from interactive environments config: Dict[str, Any] = {} if not files: return deepcopy(constants.MINIMAL_CONFIG) # We expect here a list of config filenames for path in files: logger.info(f'Using config: {path} ...') # Merge config options, overwriting old values config = deep_merge_dicts(load_config_file(path), config) # Load environment variables env_data = enironment_vars_to_dict() config = deep_merge_dicts(env_data, config) config['config_files'] = files # Normalize config if 'internals' not in config: config['internals'] = {} if 'ask_strategy' not in config: config['ask_strategy'] = {} if 'pairlists' not in config: config['pairlists'] = [] return config
def load_from_files(self, files: List[str]) -> Dict[str, Any]: # Keep this method as staticmethod, so it can be used from interactive environments config: Dict[str, Any] = {} if not files: return deepcopy(constants.MINIMAL_CONFIG) # We expect here a list of config filenames for path in files: logger.info(f'Using config: {path} ...') # Merge config options, overwriting old values config = deep_merge_dicts(load_config_file(path), config) # Normalize config if 'internals' not in config: config['internals'] = {} # TODO: This can be deleted along with removal of deprecated # experimental settings if 'ask_strategy' not in config: config['ask_strategy'] = {} if 'pairlists' not in config: config['pairlists'] = [] return config
def from_files(files: List[str]) -> Dict[str, Any]: """ Iterate through the config files passed in, loading all of them and merging their contents. Files are loaded in sequence, parameters in later configuration files override the same parameter from an earlier file (last definition wins). :param files: List of file paths :return: configuration dictionary """ # Keep this method as staticmethod, so it can be used from interactive environments config: Dict[str, Any] = {} if not files: return constants.MINIMAL_CONFIG.copy() # We expect here a list of config filenames for path in files: logger.info(f'Using config: {path} ...') # Merge config options, overwriting old values config = deep_merge_dicts(load_config_file(path), config) # Normalize config if 'internals' not in config: config['internals'] = {} # validate configuration before returning logger.info('Validating configuration ...') validate_config_schema(config) return config
def test_load_config_test_comments() -> None: """ Load config with comments """ config_file = Path(__file__).parents[0] / "config_test_comments.json" conf = load_config_file(str(config_file)) assert conf
def test_load_config_file(default_conf, mocker, caplog) -> None: del default_conf['user_data_dir'] file_mock = mocker.patch( 'freqtrade.configuration.load_config.open', mocker.mock_open(read_data=json.dumps(default_conf))) validated_conf = load_config_file('somefile') assert file_mock.call_count == 1 assert validated_conf.items() >= default_conf.items()
def load_from_files(self, files: List[str]) -> Dict[str, Any]: # Keep this method as staticmethod, so it can be used from interactive environments config: Dict[str, Any] = {} if not files: return deepcopy(constants.MINIMAL_CONFIG) # We expect here a list of config filenames for path in files: logger.info(f'Using config: {path} ...') # Merge config options, overwriting old values config = deep_merge_dicts(load_config_file(path), config) # Normalize config if 'internals' not in config: config['internals'] = {} # validate configuration before returning logger.info('Validating configuration ...') validate_config_schema(config) return config
def all_conf(): config_file = Path(__file__).parents[1] / "config_full.json.example" conf = load_config_file(str(config_file)) return conf