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
This commit is contained in:
parent
22e3918f67
commit
d5861e4653
@ -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
|
||||
|
14
mat2
14
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:
|
||||
return arg_parser.print_help()
|
||||
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()
|
||||
return 0
|
||||
|
||||
elif args.show:
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user