From 5c93752fd3dbe7bbc17b2b55a45809536edc91d0 Mon Sep 17 00:00:00 2001 From: Ben Sartori <149951068+bensartori@users.noreply.github.com> Date: Mon, 3 Jun 2024 09:01:36 +0200 Subject: [PATCH] Improved error handling and messages. --- lednamebadge.py | 70 ++++++++++++++++-------- tests/test_lednamebadge_select_method.py | 4 +- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/lednamebadge.py b/lednamebadge.py index 13a4c2c..ae3ee42 100755 --- a/lednamebadge.py +++ b/lednamebadge.py @@ -369,7 +369,7 @@ class SimpleTextAndIcons: except: print("If you like to use images, the module pillow is needed. Try:") print("$ pip install pillow") - LedNameBadge.print_install_message() + LedNameBadge._print_common_install_hints() sys.exit(1) im = Image.open(file) @@ -437,7 +437,7 @@ class WriteLibUsb(WriteMethod): try: import usb.core _module_loaded = True - print("Module pyusb detected") + print("Module usb.core detected") except: pass @@ -642,6 +642,20 @@ class LedNameBadge: elif sys.platform.startswith('win'): method = 'libusb' print("Selected method 'libusb' with Windows") + elif not WriteLibUsb.is_ready() and not WriteUsbHidApi.is_ready(): + if sys.version_info[0] < 3 or sys.platform.startswith('win'): + print("You need the usb.core module.") + LedNameBadge._print_libusb_install_hints() + sys.exit(1) + elif sys.platform.startswith('darwin'): + print("You need the pyhidapi module.") + LedNameBadge._print_hidapi_install_hints() + sys.exit(1) + else: + print("You need the pyhidapi or usb.core module.") + LedNameBadge._print_libusb_install_hints() + LedNameBadge._print_hidapi_install_hints() + sys.exit(1) if method == 'libusb': if sys.platform.startswith('darwin'): @@ -649,15 +663,7 @@ class LedNameBadge: print("Or help us implementing support for MacOs.") sys.exit(1) elif not WriteLibUsb.is_ready(): - print("The method 'libusb' is not possible to be used: The module could not be loaded.") - print("* Have you installed the Module? Try:") - print(" $ pip install pyusb") - LedNameBadge._print_install_hints() - if sys.platform.startswith('win'): - print("* Have you installed the libusb driver or libusb-filter for the device?") - elif sys.platform.startswith('linux'): - print("* Is the library itself installed? Try (or similar, suitable for your distro):") - print(" $ sudo apt-get install libusb-1.0-0") + LedNameBadge._print_libusb_install_hints() sys.exit(1) if method == 'hidapi': @@ -669,18 +675,7 @@ class LedNameBadge: print("Please use method 'libusb' or 'auto' with python-2.x because of https://github.com/jnweiger/led-badge-ls32/issues/9") sys.exit(1) elif not WriteUsbHidApi.is_ready(): - print("The method 'hidapi' is not possible to be used: The module could not be loaded.") - print("* Have you installed the Module? Try:") - print(" $ pip install pyhidapi") - LedNameBadge._print_install_hints() - if sys.platform.startswith('darwin'): - print("* Have you installed the library itself? Try:") - print(" $ brew install hidapi") - elif sys.platform.startswith('linux'): - print("* Is the library itself installed? Try (or similar, suitable for your distro):") - print(" $ sudo apt-get install libhidapi-hidraw0") - print("* If the library is still not found by the module, try (or similar, suitable for you distro):") - print(" $ sudo ln -s /usr/lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 /usr/local/lib/") + LedNameBadge._print_hidapi_install_hints() sys.exit(1) if (method == 'auto' or method == 'hidapi') and WriteUsbHidApi.is_ready(): @@ -710,7 +705,34 @@ class LedNameBadge: sys.exit(1) @staticmethod - def _print_install_hints(): + def _print_libusb_install_hints(): + print("The method 'libusb' is not possible to be used: The module usb.core could not be loaded.") + print("* Have you installed the Module? Try:") + print(" $ pip install pyusb") + LedNameBadge._print_common_install_hints() + if sys.platform.startswith('win'): + print("* Have you installed the libusb driver or libusb-filter for the device?") + elif sys.platform.startswith('linux'): + print("* Is the library itself installed? Try (or similar, suitable for your distro):") + print(" $ sudo apt-get install libusb-1.0-0") + + @staticmethod + def _print_hidapi_install_hints(): + print("The method 'hidapi' is not possible to be used: The module pyhidapi could not be loaded.") + print("* Have you installed the Module? Try:") + print(" $ pip install pyhidapi") + LedNameBadge._print_common_install_hints() + if sys.platform.startswith('darwin'): + print("* Have you installed the library itself? Try:") + print(" $ brew install hidapi") + elif sys.platform.startswith('linux'): + print("* Is the library itself installed? Try (or similar, suitable for your distro):") + print(" $ sudo apt-get install libhidapi-hidraw0") + print("* If the library is still not found by the module, try (or similar, suitable for you distro):") + print(" $ sudo ln -s /usr/lib/x86_64-linux-gnu/libhidapi-hidraw.so.0 /usr/local/lib/") + + @staticmethod + def _print_common_install_hints(): print(" (You may need to use pip3 or pip2 instead of pip depending on your python version.)") print(" (You may need prepend 'sudo' for system wide module installation.)") if sys.platform.startswith('linux'): diff --git a/tests/test_lednamebadge_select_method.py b/tests/test_lednamebadge_select_method.py index a9a67f3..ff5b3f0 100644 --- a/tests/test_lednamebadge_select_method.py +++ b/tests/test_lednamebadge_select_method.py @@ -85,7 +85,7 @@ class Test(TestCase): def test_all_out_linux_negative(self): method, output = self.call_it(False, False, False, None, None) self.assertNotIn('device initialized', output) - self.assertIn('device is not available', output) + self.assertIn('You need', output) self.assertIsNone(method) method, output = self.call_it(False, False, False, 'libusb', None) @@ -135,7 +135,7 @@ class Test(TestCase): pass output = stdio_mock.getvalue() print(output) - self.assertEqual(pyusb_available, 'pyusb detected' in output) + self.assertEqual(pyusb_available, 'usb.core detected' in output) self.assertEqual(pyhidapi_available, 'pyhidapi detected' in output) return method_obj, output