diff --git a/mopidy/utils/deps.py b/mopidy/utils/deps.py index 167e9be2..2c55efb3 100644 --- a/mopidy/utils/deps.py +++ b/mopidy/utils/deps.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +import functools import os import platform import sys @@ -8,6 +9,7 @@ import pygst pygst.require('0.10') import gst +import pkg_resources import pykka from . import formatting @@ -37,8 +39,17 @@ def format_dependency_list(adapters=None): serial_info, cherrypy_info, ws4py_info, + functools.partial(pkg_info, 'Mopidy', True), ] + dist_names = set([ + ep.dist.project_name for ep in + pkg_resources.iter_entry_points('mopidy.ext') + if ep.dist.project_name != 'Mopidy']) + for dist_name in dist_names: + adapters.append( + functools.partial(pkg_info, dist_name)) + return '\n'.join([_format_dependency(a()) for a in adapters]) @@ -83,6 +94,21 @@ def python_info(): } +def pkg_info(project_name=None, include_extras=False): + if project_name is None: + project_name = 'Mopidy' + distribution = pkg_resources.get_distribution(project_name) + extras = include_extras and distribution.extras or [] + dependencies = [ + pkg_info(d) for d in distribution.requires(extras)] + return { + 'name': distribution.project_name, + 'version': distribution.version, + 'path': distribution.location, + 'dependencies': dependencies, + } + + def gstreamer_info(): other = [] other.append('Python wrapper: gst-python %s' % ( diff --git a/tests/utils/deps_test.py b/tests/utils/deps_test.py index 90afd45c..fff0c1c3 100644 --- a/tests/utils/deps_test.py +++ b/tests/utils/deps_test.py @@ -5,6 +5,8 @@ import platform import pygst pygst.require('0.10') import gst + +import mock import pykka try: @@ -156,3 +158,40 @@ class DepsTest(unittest.TestCase): self.assertEquals('ws4py', result['name']) self.assertEquals(ws4py.__version__, result['version']) self.assertIn('ws4py', result['path']) + + @mock.patch('pkg_resources.get_distribution') + def test_pkg_info(self, get_distribution_mock): + dist_mopidy = mock.Mock() + dist_mopidy.project_name = 'Mopidy' + dist_mopidy.version = '0.13' + dist_mopidy.location = '/tmp/example/mopidy' + dist_mopidy.requires.return_value = ['Pykka'] + + dist_pykka = mock.Mock() + dist_pykka.project_name = 'Pykka' + dist_pykka.version = '1.1' + dist_pykka.location = '/tmp/example/pykka' + dist_pykka.requires.return_value = ['setuptools'] + + dist_setuptools = mock.Mock() + dist_setuptools.project_name = 'setuptools' + dist_setuptools.version = '0.6' + dist_setuptools.location = '/tmp/example/setuptools' + dist_setuptools.requires.return_value = [] + + get_distribution_mock.side_effect = [ + dist_mopidy, dist_pykka, dist_setuptools] + + result = deps.pkg_info() + + self.assertEquals('Mopidy', result['name']) + self.assertEquals('0.13', result['version']) + self.assertIn('mopidy', result['path']) + + dep_info_pykka = result['dependencies'][0] + self.assertEquals('Pykka', dep_info_pykka['name']) + self.assertEquals('1.1', dep_info_pykka['version']) + + dep_info_setuptools = dep_info_pykka['dependencies'][0] + self.assertEquals('setuptools', dep_info_setuptools['name']) + self.assertEquals('0.6', dep_info_setuptools['version'])