def load_config(self) -> Dict[str, Any]: """ Extract information for sys.argv and load the bot configuration :return: Configuration dictionary """ # Load all configs config: Dict[str, Any] = self.load_from_files(self.args.get("config", [])) # Keep a copy of the original configuration file config['original_config'] = deepcopy(config) self._process_logging_options(config) self._process_runmode(config) self._process_common_options(config) self._process_trading_options(config) self._process_optimize_options(config) self._process_plot_options(config) # Check if the exchange set by the user is supported check_exchange( config, config.get('experimental', {}).get('block_bad_exchanges', True)) self._resolve_pairs_list(config) process_temporary_deprecated_settings(config) return config
def test_process_temporary_deprecated_settings(mocker, default_conf, setting, caplog): patched_configuration_load_config_file(mocker, default_conf) # Create sections for new and deprecated settings # (they may not exist in the config) default_conf[setting[0]] = {} default_conf[setting[3]] = {} # Assign new setting default_conf[setting[0]][setting[1]] = setting[2] # Assign deprecated setting default_conf[setting[3]][setting[4]] = setting[5] # New and deprecated settings are conflicting ones with pytest.raises(OperationalException, match=r'DEPRECATED'): process_temporary_deprecated_settings(default_conf) caplog.clear() # Delete new setting del default_conf[setting[0]][setting[1]] process_temporary_deprecated_settings(default_conf) assert log_has_re('DEPRECATED', caplog) # The value of the new setting shall have been set to the # value of the deprecated one assert default_conf[setting[0]][setting[1]] == setting[5]
def test_process_deprecated_setting_edge(mocker, edge_conf, caplog): patched_configuration_load_config_file(mocker, edge_conf) edge_conf.update({'edge': { 'enabled': True, 'capital_available_percentage': 0.5, }}) process_temporary_deprecated_settings(edge_conf) assert log_has_re(r"DEPRECATED.*Using 'edge.capital_available_percentage'*", caplog)
def test_process_deprecated_protections(default_conf, caplog): message = "DEPRECATED: Setting 'protections' in the configuration is deprecated." config = deepcopy(default_conf) process_temporary_deprecated_settings(config) assert not log_has(message, caplog) config['protections'] = [] process_temporary_deprecated_settings(config) assert log_has(message, caplog)
def test_process_deprecated_setting_edge(mocker, edge_conf): patched_configuration_load_config_file(mocker, edge_conf) edge_conf.update({'edge': { 'enabled': True, 'capital_available_percentage': 0.5, }}) with pytest.raises(OperationalException, match=r"DEPRECATED.*Using 'edge.capital_available_percentage'*"): process_temporary_deprecated_settings(edge_conf)
def test_process_deprecated_setting_pairlists(mocker, default_conf, caplog): patched_configuration_load_config_file(mocker, default_conf) default_conf.update({'pairlist': { 'method': 'VolumePairList', 'config': {'precision_filter': True} }}) process_temporary_deprecated_settings(default_conf) assert log_has_re(r'DEPRECATED.*precision_filter.*', caplog) assert log_has_re(r'DEPRECATED.*in pairlist is deprecated and must be moved*', caplog)
def test_process_removed_settings(mocker, default_conf, setting): patched_configuration_load_config_file(mocker, default_conf) # Create sections for new and deprecated settings # (they may not exist in the config) default_conf[setting[0]] = {} # Assign removed setting default_conf[setting[0]][setting[1]] = setting[2] # New and deprecated settings are conflicting ones with pytest.raises(OperationalException, match=r'Setting .* has been moved'): process_temporary_deprecated_settings(default_conf)
def test_process_deprecated_ticker_interval(default_conf, caplog): message = "DEPRECATED: Please use 'timeframe' instead of 'ticker_interval." config = deepcopy(default_conf) process_temporary_deprecated_settings(config) assert not log_has(message, caplog) del config['timeframe'] config['ticker_interval'] = '15m' with pytest.raises( OperationalException, match=r"DEPRECATED: 'ticker_interval' detected. Please use.*"): process_temporary_deprecated_settings(config)
def load_config(self) -> Dict[str, Any]: """ Extract information for sys.argv and load the bot configuration :return: Configuration dictionary """ # Load all configs config: Dict[str, Any] = load_from_files(self.args.get("config", [])) # Load environment variables env_data = enironment_vars_to_dict() config = deep_merge_dicts(env_data, config) # Normalize config if 'internals' not in config: config['internals'] = {} if 'pairlists' not in config: config['pairlists'] = [] # Keep a copy of the original configuration file config['original_config'] = deepcopy(config) self._process_logging_options(config) self._process_runmode(config) self._process_common_options(config) self._process_trading_options(config) self._process_optimize_options(config) self._process_plot_options(config) self._process_data_options(config) # Check if the exchange set by the user is supported check_exchange( config, config.get('experimental', {}).get('block_bad_exchanges', True)) self._resolve_pairs_list(config) process_temporary_deprecated_settings(config) return config
def test_process_deprecated_ticker_interval(mocker, default_conf, caplog): message = "DEPRECATED: Please use 'timeframe' instead of 'ticker_interval." config = deepcopy(default_conf) process_temporary_deprecated_settings(config) assert not log_has(message, caplog) del config['timeframe'] config['ticker_interval'] = '15m' process_temporary_deprecated_settings(config) assert log_has(message, caplog) assert config['ticker_interval'] == '15m' config = deepcopy(default_conf) # Have both timeframe and ticker interval in config # Can also happen when using ticker_interval in configuration, and --timeframe as cli argument config['timeframe'] = '5m' config['ticker_interval'] = '4h' with pytest.raises(OperationalException, match=r"Both 'timeframe' and 'ticker_interval' detected."): process_temporary_deprecated_settings(config)