From d5861e46537f3e94abd26f63a3a7ad5b69d25e77 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 10 Jul 2018 20:49:54 +0200 Subject: [PATCH] Implement a check for dependencies in mat2 Example use: ``` $ mat2 -c Dependencies required for MAT2 0.1.3: - Cairo: yes - Exiftool: yes - GdkPixbuf from PyGobject: yes - Mutagen: yes - Poppler from PyGobject: yes - PyGobject: yes ``` This should close #35 --- libmat2/__init__.py | 33 +++++++++++++++++++++++++++++++++ mat2 | 14 +++++++++++--- tests/test_climat2.py | 9 +++++++-- tests/test_libmat2.py | 8 ++++++++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/libmat2/__init__.py b/libmat2/__init__.py index d910215..cd65bfc 100644 --- a/libmat2/__init__.py +++ b/libmat2/__init__.py @@ -1,5 +1,13 @@ #!/bin/env python3 +import os +import collections +import importlib +from typing import Dict + +# make pyflakes happy +assert Dict + # A set of extension that aren't supported, despite matching a supported mimetype UNSUPPORTED_EXTENSIONS = { '.asc', @@ -17,3 +25,28 @@ UNSUPPORTED_EXTENSIONS = { '.xsd', '.xsl', } + +DEPENDENCIES = { + 'cairo': 'Cairo', + 'gi': 'PyGobject', + 'gi.repository.GdkPixbuf': 'GdkPixbuf from PyGobject', + 'gi.repository.Poppler': 'Poppler from PyGobject', + 'mutagen': 'Mutagen', + } + +def check_dependencies() -> dict: + ret = collections.defaultdict(bool) # type: Dict[str, bool] + + exiftool = '/usr/bin/exiftool' + ret['Exiftool'] = False + if os.path.isfile(exiftool) and os.access(exiftool, os.X_OK): # pragma: no cover + ret['Exiftool'] = True + + for key, value in DEPENDENCIES.items(): + ret[value] = True + try: + importlib.import_module(key) + except ImportError: # pragma: no cover + ret[value] = False # pragma: no cover + + return ret diff --git a/mat2 b/mat2 index 7c7b652..efc0478 100755 --- a/mat2 +++ b/mat2 @@ -9,7 +9,7 @@ import argparse import multiprocessing try: - from libmat2 import parser_factory, UNSUPPORTED_EXTENSIONS + from libmat2 import parser_factory, UNSUPPORTED_EXTENSIONS, check_dependencies except ValueError as e: print(e) sys.exit(1) @@ -36,6 +36,9 @@ def create_arg_parser(): version='MAT2 %s' % __version__) parser.add_argument('-l', '--list', action='store_true', help='list all supported fileformats') + parser.add_argument('-c', '--check-dependencies', action='store_true', + help='check if MAT2 has all the dependencies it needs') + info = parser.add_mutually_exclusive_group() info.add_argument('-s', '--show', action='store_true', @@ -108,9 +111,14 @@ def main(): args = arg_parser.parse_args() if not args.files: - if not args.list: + if args.list: + show_parsers() + elif args.check_dependencies: + print("Dependencies required for MAT2 %s:" % __version__) + for key, value in sorted(check_dependencies().items()): + print('- %s: %s' % (key, 'yes' if value else 'no')) + else: return arg_parser.print_help() - show_parsers() return 0 elif args.show: diff --git a/tests/test_climat2.py b/tests/test_climat2.py index 9948057..99f9b9c 100644 --- a/tests/test_climat2.py +++ b/tests/test_climat2.py @@ -8,12 +8,12 @@ class TestHelp(unittest.TestCase): def test_help(self): proc = subprocess.Popen(['./mat2', '--help'], stdout=subprocess.PIPE) stdout, _ = proc.communicate() - self.assertIn(b'usage: mat2 [-h] [-v] [-l] [-s | -L] [files [files ...]]', stdout) + self.assertIn(b'usage: mat2 [-h] [-v] [-l] [-c] [-s | -L] [files [files ...]]', stdout) def test_no_arg(self): proc = subprocess.Popen(['./mat2'], stdout=subprocess.PIPE) stdout, _ = proc.communicate() - self.assertIn(b'usage: mat2 [-h] [-v] [-l] [-s | -L] [files [files ...]]', stdout) + self.assertIn(b'usage: mat2 [-h] [-v] [-l] [-c] [-s | -L] [files [files ...]]', stdout) class TestVersion(unittest.TestCase): @@ -22,6 +22,11 @@ class TestVersion(unittest.TestCase): stdout, _ = proc.communicate() self.assertTrue(stdout.startswith(b'MAT2 ')) +class TestDependencies(unittest.TestCase): + def test_dependencies(self): + proc = subprocess.Popen(['./mat2', '--check-dependencies'], stdout=subprocess.PIPE) + stdout, _ = proc.communicate() + self.assertTrue(b'MAT2' in stdout) class TestReturnValue(unittest.TestCase): def test_nonzero(self): diff --git a/tests/test_libmat2.py b/tests/test_libmat2.py index cb37985..fa7e281 100644 --- a/tests/test_libmat2.py +++ b/tests/test_libmat2.py @@ -7,6 +7,14 @@ import zipfile import tempfile from libmat2 import pdf, images, audio, office, parser_factory, torrent, harmless +from libmat2 import check_dependencies + + +class TestCheckDependencies(unittest.TestCase): + def test_deps(self): + ret = check_dependencies() + for key, value in ret.items(): + self.assertTrue(value) class TestParserFactory(unittest.TestCase):