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
|
#!/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
|
# A set of extension that aren't supported, despite matching a supported mimetype
|
||||||
UNSUPPORTED_EXTENSIONS = {
|
UNSUPPORTED_EXTENSIONS = {
|
||||||
'.asc',
|
'.asc',
|
||||||
@ -17,3 +25,28 @@ UNSUPPORTED_EXTENSIONS = {
|
|||||||
'.xsd',
|
'.xsd',
|
||||||
'.xsl',
|
'.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
|
import multiprocessing
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from libmat2 import parser_factory, UNSUPPORTED_EXTENSIONS
|
from libmat2 import parser_factory, UNSUPPORTED_EXTENSIONS, check_dependencies
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
print(e)
|
print(e)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -36,6 +36,9 @@ def create_arg_parser():
|
|||||||
version='MAT2 %s' % __version__)
|
version='MAT2 %s' % __version__)
|
||||||
parser.add_argument('-l', '--list', action='store_true',
|
parser.add_argument('-l', '--list', action='store_true',
|
||||||
help='list all supported fileformats')
|
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 = parser.add_mutually_exclusive_group()
|
||||||
info.add_argument('-s', '--show', action='store_true',
|
info.add_argument('-s', '--show', action='store_true',
|
||||||
@ -108,9 +111,14 @@ def main():
|
|||||||
args = arg_parser.parse_args()
|
args = arg_parser.parse_args()
|
||||||
|
|
||||||
if not args.files:
|
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()
|
return arg_parser.print_help()
|
||||||
show_parsers()
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
elif args.show:
|
elif args.show:
|
||||||
|
@ -8,12 +8,12 @@ class TestHelp(unittest.TestCase):
|
|||||||
def test_help(self):
|
def test_help(self):
|
||||||
proc = subprocess.Popen(['./mat2', '--help'], stdout=subprocess.PIPE)
|
proc = subprocess.Popen(['./mat2', '--help'], stdout=subprocess.PIPE)
|
||||||
stdout, _ = proc.communicate()
|
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):
|
def test_no_arg(self):
|
||||||
proc = subprocess.Popen(['./mat2'], stdout=subprocess.PIPE)
|
proc = subprocess.Popen(['./mat2'], stdout=subprocess.PIPE)
|
||||||
stdout, _ = proc.communicate()
|
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):
|
class TestVersion(unittest.TestCase):
|
||||||
@ -22,6 +22,11 @@ class TestVersion(unittest.TestCase):
|
|||||||
stdout, _ = proc.communicate()
|
stdout, _ = proc.communicate()
|
||||||
self.assertTrue(stdout.startswith(b'MAT2 '))
|
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):
|
class TestReturnValue(unittest.TestCase):
|
||||||
def test_nonzero(self):
|
def test_nonzero(self):
|
||||||
|
@ -7,6 +7,14 @@ import zipfile
|
|||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from libmat2 import pdf, images, audio, office, parser_factory, torrent, harmless
|
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):
|
class TestParserFactory(unittest.TestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user