URI: 
       thw: check_libraries_available now gets version of incompatible libs - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 8c3920a0db10d5519bc2435a5354c13aadb5ed1c
   DIR parent 1546d65ebe97aaf968936421fb2ed997b1de71e1
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Thu,  6 Dec 2018 18:16:34 +0100
       
       hw: check_libraries_available now gets version of incompatible libs
       
       previously we would return early and the user would
       just see "missing libraries"
       
       Diffstat:
         M electrum/plugins/coldcard/coldcard… |      11 ++++++++---
         M electrum/plugins/hw_wallet/plugin.… |      29 +++++++++++++++++------------
         M electrum/plugins/trezor/trezor.py   |      14 +++++++++-----
       
       3 files changed, 34 insertions(+), 20 deletions(-)
       ---
   DIR diff --git a/electrum/plugins/coldcard/coldcard.py b/electrum/plugins/coldcard/coldcard.py
       t@@ -17,6 +17,7 @@ from electrum.util import print_error, bfh, bh2u, versiontuple, UserFacingExcept
        from electrum.base_wizard import ScriptTypeNotSupported
        
        from ..hw_wallet import HW_PluginBase
       +from ..hw_wallet.plugin import LibraryFoundButUnusable
        
        try:
            import hid
       t@@ -610,7 +611,7 @@ class ColdcardPlugin(HW_PluginBase):
            def __init__(self, parent, config, name):
                HW_PluginBase.__init__(self, parent, config, name)
        
       -        self.libraries_available = self.check_libraries_available() and requirements_ok
       +        self.libraries_available = self.check_libraries_available()
                if not self.libraries_available:
                    return
        
       t@@ -620,9 +621,13 @@ class ColdcardPlugin(HW_PluginBase):
            def get_library_version(self):
                import ckcc
                try:
       -            return ckcc.__version__
       +            version = ckcc.__version__
                except AttributeError:
       -            return 'unknown'
       +            version = 'unknown'
       +        if requirements_ok:
       +            return version
       +        else:
       +            raise LibraryFoundButUnusable(library_version=version)
        
            def detect_simulator(self):
                # if there is a simulator running on this machine,
   DIR diff --git a/electrum/plugins/hw_wallet/plugin.py b/electrum/plugins/hw_wallet/plugin.py
       t@@ -86,6 +86,7 @@ class HW_PluginBase(BasePlugin):
        
                Returns 'unknown' if library is found but cannot determine version.
                Raises 'ImportError' if library is not found.
       +        Raises 'LibraryFoundButUnusable' if found but there was some problem (includes version num).
                """
                raise NotImplementedError()
        
       t@@ -94,23 +95,22 @@ class HW_PluginBase(BasePlugin):
                    return ".".join(str(i) for i in t)
        
                try:
       +            # this might raise ImportError or LibraryFoundButUnusable
                    library_version = self.get_library_version()
       +            # if no exception so far, we might still raise LibraryFoundButUnusable
       +            if (library_version == 'unknown'
       +                    or versiontuple(library_version) < self.minimum_library
       +                    or hasattr(self, "maximum_library") and versiontuple(library_version) >= self.maximum_library):
       +                raise LibraryFoundButUnusable(library_version=library_version)
                except ImportError:
                    return False
       -        if library_version == 'unknown' or \
       -                versiontuple(library_version) < self.minimum_library:
       -            self.libraries_available_message = (
       -                    _("Library version for '{}' is too old.").format(self.name)
       -                    + '\nInstalled: {}, Needed: {}'
       -                    .format(library_version, version_str(self.minimum_library)))
       -            self.print_stderr(self.libraries_available_message)
       -            return False
       -        elif hasattr(self, "maximum_library") and \
       -                versiontuple(library_version) >= self.maximum_library:
       +        except LibraryFoundButUnusable as e:
       +            library_version = e.library_version
       +            max_version_str = version_str(self.maximum_library) if hasattr(self, "maximum_library") else "inf"
                    self.libraries_available_message = (
                            _("Library version for '{}' is incompatible.").format(self.name)
       -                    + '\nInstalled: {}, Needed: less than {}'
       -                    .format(library_version, version_str(self.maximum_library)))
       +                    + '\nInstalled: {}, Needed: {} <= x < {}'
       +                    .format(library_version, version_str(self.minimum_library), max_version_str))
                    self.print_stderr(self.libraries_available_message)
                    return False
        
       t@@ -155,3 +155,8 @@ def only_hook_if_libraries_available(func):
                if not self.libraries_available: return None
                return func(self, *args, **kwargs)
            return wrapper
       +
       +
       +class LibraryFoundButUnusable(Exception):
       +    def __init__(self, library_version='unknown'):
       +        self.library_version = library_version
   DIR diff --git a/electrum/plugins/trezor/trezor.py b/electrum/plugins/trezor/trezor.py
       t@@ -12,7 +12,8 @@ from electrum.keystore import Hardware_KeyStore, is_xpubkey, parse_xpubkey
        from electrum.base_wizard import ScriptTypeNotSupported, HWD_SETUP_NEW_WALLET
        
        from ..hw_wallet import HW_PluginBase
       -from ..hw_wallet.plugin import is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data
       +from ..hw_wallet.plugin import (is_any_tx_output_on_change_branch, trezor_validate_op_return_output_and_get_data,
       +                                LibraryFoundButUnusable)
        
        try:
            import trezorlib
       t@@ -112,12 +113,15 @@ class TrezorPlugin(HW_PluginBase):
                self.device_manager().register_enumerate_func(self.enumerate)
        
            def get_library_version(self):
       -        if not TREZORLIB:
       -            raise ImportError
       +        import trezorlib
                try:
       -            return trezorlib.__version__
       +            version = trezorlib.__version__
                except Exception:
       -            return 'unknown'
       +            version = 'unknown'
       +        if TREZORLIB:
       +            return version
       +        else:
       +            raise LibraryFoundButUnusable(library_version=version)
        
            def enumerate(self):
                devices = trezorlib.transport.enumerate_devices()