tRemove constructor method of plugins - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 1d079602901047f551736002b4189f21e9bbf3d3 DIR parent cf4ee487cd66a139a74c1690ce581c592e7a752d HTML Author: Neil Booth <kyuupichan@gmail.com> Date: Fri, 1 Jan 2016 23:39:19 +0900 Remove constructor method of plugins Clean up wallet class loading. Diffstat: M lib/plugins.py | 7 +++++-- M lib/wallet.py | 34 ++++++++++++++----------------- M plugins/ledger/ledger.py | 3 --- M plugins/trezor/plugin.py | 3 --- M plugins/trustedcoin/qt.py | 8 +++++--- M plugins/trustedcoin/trustedcoin.py | 8 +++----- 6 files changed, 28 insertions(+), 35 deletions(-) --- DIR diff --git a/lib/plugins.py b/lib/plugins.py t@@ -118,10 +118,13 @@ class Plugins(DaemonThread): return result def register_plugin_wallet(self, name, gui_good, details): + def dynamic_constructor(storage): + return self.wallet_plugin_loader(name).wallet_class(storage) + if details[0] == 'hardware': self.hw_wallets[name] = (gui_good, details) - register = details + (lambda: self.wallet_plugin_loader(name),) - wallet.wallet_types.append(register) + self.print_error("registering wallet %s: %s" %(name, details)) + wallet.wallet_types.append(details + (dynamic_constructor,)) def wallet_plugin_loader(self, name): if not name in self.plugins: DIR diff --git a/lib/wallet.py b/lib/wallet.py t@@ -1908,25 +1908,7 @@ class Wallet(object): raise BaseException(msg) wallet_type = storage.get('wallet_type') - if wallet_type: - for cat, t, name, loader in wallet_types: - if t == wallet_type: - if cat in ['hardware', 'twofactor']: - WalletClass = lambda storage: apply(loader().constructor, (storage,)) - else: - WalletClass = loader - break - else: - if re.match('(\d+)of(\d+)', wallet_type): - WalletClass = Multisig_Wallet - else: - raise RuntimeError("Unknown wallet type: " + wallet_type) - else: - if seed_version == OLD_SEED_VERSION: - WalletClass = OldWallet - else: - WalletClass = NewWallet - + WalletClass = Wallet.wallet_class(wallet_type, seed_version) wallet = WalletClass(storage) # Convert hardware wallets restored with older versions of t@@ -1941,6 +1923,20 @@ class Wallet(object): return wallet @staticmethod + def wallet_class(wallet_type, seed_version): + if wallet_type: + if Wallet.multisig_type(wallet_type): + return Multisig_Wallet + + for info in wallet_types: + if wallet_type == info[1]: + return info[3] + + raise RuntimeError("Unknown wallet type: " + wallet_type) + + return OldWallet if seed_version == OLD_SEED_VERSION else NewWallet + + @staticmethod def is_seed(seed): return is_old_seed(seed) or is_new_seed(seed) DIR diff --git a/plugins/ledger/ledger.py b/plugins/ledger/ledger.py t@@ -419,9 +419,6 @@ class LedgerPlugin(BasePlugin): self.device = self.wallet_class.device self.handler = None - def constructor(self, s): - return BTChipWallet(s) - def is_enabled(self): return BTCHIP DIR diff --git a/plugins/trezor/plugin.py b/plugins/trezor/plugin.py t@@ -129,9 +129,6 @@ class TrezorCompatiblePlugin(BasePlugin): self.client = None self.wallet_class.plugin = self - def constructor(self, s): - return self.wallet_class(s) - def give_error(self, message): self.print_error(message) raise Exception(message) DIR diff --git a/plugins/trustedcoin/qt.py b/plugins/trustedcoin/qt.py t@@ -31,7 +31,7 @@ from electrum.i18n import _ from electrum.plugins import hook from electrum import wizard -from trustedcoin import TrustedCoinPlugin, Wallet_2fa, DISCLAIMER, server +from trustedcoin import TrustedCoinPlugin, DISCLAIMER, server def need_server(wallet, tx): from electrum.account import BIP32_Account t@@ -79,7 +79,8 @@ class Plugin(TrustedCoinPlugin): def sign_tx(self, window, tx): self.print_error("twofactor:sign_tx") wallet = window.wallet - if type(wallet) is Wallet_2fa and not wallet.can_sign_without_server(): + assert isinstace(wallet, self.wallet_class) + if not wallet.can_sign_without_server(): auth_code = None if need_server(wallet, tx): auth_code = self.auth_dialog(window) t@@ -100,7 +101,8 @@ class Plugin(TrustedCoinPlugin): @hook def abort_send(self, window): wallet = window.wallet - if type(wallet) is Wallet_2fa and not wallet.can_sign_without_server(): + assert isinstace(wallet, self.wallet_class) + if not wallet.can_sign_without_server(): if wallet.billing_info is None: # request billing info before forming the transaction waiting_dialog(self, window).wait() DIR diff --git a/plugins/trustedcoin/trustedcoin.py b/plugins/trustedcoin/trustedcoin.py t@@ -287,13 +287,11 @@ def make_billing_address(wallet, num): class TrustedCoinPlugin(BasePlugin): + wallet_class = Wallet_2fa def __init__(self, parent, config, name): BasePlugin.__init__(self, parent, config, name) - Wallet_2fa.plugin = self - - def constructor(self, s): - return Wallet_2fa(s) + self.wallet_class.plugin = self @staticmethod def is_valid_seed(seed): t@@ -348,7 +346,7 @@ class TrustedCoinPlugin(BasePlugin): window.wallet.is_billing = False def on_restore_wallet(self, wallet, wizard): - assert isinstance(wallet, Wallet_2fa) + assert isinstance(wallet, self.wallet_class) seed = wizard.request_seed(RESTORE_MSG, is_valid=self.is_valid_seed) password = wizard.request_password()