URI: 
       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()