Commit f19f6ed8 authored by atenart's avatar atenart Committed by jvoisin

Rework the dependency checks to distinguish required/optional ones

Rework the dependencies definition to include a 'required' flags, which
is passed by the check_dependencies helper to the callers, so that they
can distinguish between required and optional dependencies.

This help in two ways:
- The unit test for the dependencies was now failing when an optional
  one was missing, due to a previous rework.
- Mat2's --check-dependencies was referring to "required dependencies"
  and was misleading for the user as some of them could be optional.
Signed-off-by: atenart's avatarAntoine Tenart <>
parent 51ab2db2
......@@ -30,35 +30,65 @@ UNSUPPORTED_EXTENSIONS = {
'Cairo': 'cairo',
'PyGobject': 'gi',
'GdkPixbuf from PyGobject': 'gi.repository.GdkPixbuf',
'Poppler from PyGobject': 'gi.repository.Poppler',
'GLib from PyGobject': 'gi.repository.GLib',
'Mutagen': 'mutagen',
'Cairo': {
'module': 'cairo',
'required': True,
'PyGobject': {
'module': 'gi',
'required': True,
'GdkPixbuf from PyGobject': {
'module': 'gi.repository.GdkPixbuf',
'required': True,
'Poppler from PyGobject': {
'module': 'gi.repository.Poppler',
'required': True,
'GLib from PyGobject': {
'module': 'gi.repository.GLib',
'required': True,
'Mutagen': {
'module': 'mutagen',
'required': True,
'Exiftool': exiftool._get_exiftool_path,
'Ffmpeg': video._get_ffmpeg_path,
'Exiftool': {
'cmd': exiftool._get_exiftool_path,
'required': False,
'Ffmpeg': {
'cmd': video._get_ffmpeg_path,
'required': False,
def check_dependencies() -> Dict[str, bool]:
def check_dependencies() -> Dict[str, Dict[str, bool]]:
ret = collections.defaultdict(bool) # type: Dict[str, bool]
for key, value in DEPENDENCIES.items():
ret[key] = True
ret[key] = {
'found': True,
'required': value['required'],
except ImportError: # pragma: no cover
ret[key] = False # pragma: no cover
ret[key]['found'] = False
for k, v in CMD_DEPENDENCIES.items():
ret[k] = True
ret[k] = {
'found': True,
'required': v['required'],
except RuntimeError: # pragma: no cover
ret[k] = False
ret[k]['found'] = False
return ret
......@@ -165,9 +165,10 @@ def main() -> int:
return 0
elif args.check_dependencies:
print("Dependencies required for MAT2 %s:" % __version__)
print("Dependencies for MAT2 %s:" % __version__)
for key, value in sorted(check_dependencies().items()):
print('- %s: %s' % (key, 'yes' if value else 'no'))
print('- %s: %s %s' % (key, 'yes' if value['found'] else 'no',
'(optional)' if not value['required'] else ''))
return 0
......@@ -16,7 +16,8 @@ class TestCheckDependencies(unittest.TestCase):
def test_deps(self):
ret = check_dependencies()
for key, value in ret.items():
self.assertTrue(value, "The value for %s is False" % key)
if value['required']:
self.assertTrue(value['found'], "The value for %s is False" % key)
class TestParserFactory(unittest.TestCase):
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment