From f8ebcf35b4081820b3b6d63f8144ed21b10af880 Mon Sep 17 00:00:00 2001 From: Lex Berezhny Date: Tue, 10 Jul 2018 20:48:57 -0400 Subject: [PATCH] Env accepts custom Coin class (#517) * + support for passing an actual coin class to Env() * unit test for Env() accept coin class * doc string explaining optional Coin argument to Env and assert to make sure a coin is a Coin --- electrumx/server/env.py | 17 ++++++++++++----- tests/server/test_env.py | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/electrumx/server/env.py b/electrumx/server/env.py index fc5cd20..f8aee29 100644 --- a/electrumx/server/env.py +++ b/electrumx/server/env.py @@ -22,20 +22,27 @@ NetIdentity = namedtuple('NetIdentity', 'host tcp_port ssl_port nick_suffix') class Env(EnvBase): - '''Wraps environment configuration.''' + '''Wraps environment configuration. Optionally, accepts a Coin class + as first argument to have ElectrumX serve custom coins not part of + the standard distribution. + ''' # Peer discovery PD_OFF, PD_SELF, PD_ON = range(3) - def __init__(self): + def __init__(self, coin=None): super().__init__() self.obsolete(['UTXO_MB', 'HIST_MB', 'NETWORK']) self.db_dir = self.required('DB_DIRECTORY') self.db_engine = self.default('DB_ENGINE', 'leveldb') self.daemon_url = self.required('DAEMON_URL') - coin_name = self.required('COIN').strip() - network = self.default('NET', 'mainnet').strip() - self.coin = Coin.lookup_coin_class(coin_name, network) + if coin is not None: + assert issubclass(coin, Coin) + self.coin = coin + else: + coin_name = self.required('COIN').strip() + network = self.default('NET', 'mainnet').strip() + self.coin = Coin.lookup_coin_class(coin_name, network) self.cache_MB = self.integer('CACHE_MB', 1200) self.host = self.default('HOST', 'localhost') self.reorg_limit = self.integer('REORG_LIMIT', self.coin.REORG_LIMIT) diff --git a/tests/server/test_env.py b/tests/server/test_env.py index df27eac..37f5640 100644 --- a/tests/server/test_env.py +++ b/tests/server/test_env.py @@ -351,3 +351,7 @@ def test_ban_versions(): assert e.drop_client == re.compile(ban_re) assert e.drop_client.match("1.2.3_buggy_client") assert e.drop_client.match("1.3.0_good_client") is None + +def test_coin_class_provided(): + e = Env(lib_coins.BitcoinCash) + assert e.coin == lib_coins.BitcoinCash \ No newline at end of file