1
0
mirror of synced 2024-11-25 18:54:22 +01:00

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:
jvoisin 2018-07-10 20:49:54 +02:00
parent 22e3918f67
commit d5861e4653
4 changed files with 59 additions and 5 deletions

View File

@ -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
View File

@ -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:
return arg_parser.print_help()
show_parsers() 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 return 0
elif args.show: elif args.show:

View File

@ -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):

View File

@ -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):