From 5a0529b142ce022110e0ce6d92b8ce890b47c65f Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Tue, 16 Oct 2012 21:36:22 +0200 Subject: [PATCH] Empty utils/__init__.py --- mopidy/__main__.py | 21 ++++---- mopidy/audio/actor.py | 13 +++-- mopidy/backends/local/translator.py | 2 +- mopidy/frontends/mpd/actor.py | 5 +- mopidy/frontends/mpd/dispatcher.py | 14 +++-- mopidy/utils/__init__.py | 52 ------------------- mopidy/utils/encoding.py | 8 +++ mopidy/utils/importing.py | 23 ++++++++ mopidy/utils/network.py | 4 +- .../{decode_test.py => encoding_test.py} | 4 +- .../utils/{init_test.py => importing_test.py} | 12 ++--- 11 files changed, 77 insertions(+), 81 deletions(-) create mode 100644 mopidy/utils/encoding.py create mode 100644 mopidy/utils/importing.py rename tests/utils/{decode_test.py => encoding_test.py} (90%) rename tests/utils/{init_test.py => importing_test.py} (68%) diff --git a/mopidy/__main__.py b/mopidy/__main__.py index a4982362..aa108f2c 100644 --- a/mopidy/__main__.py +++ b/mopidy/__main__.py @@ -29,10 +29,9 @@ sys.path.insert( import mopidy -from mopidy import audio, core, exceptions, settings, utils -from mopidy.utils import log, path, process -from mopidy.utils.deps import list_deps_optparse_callback -from mopidy.utils.settings import list_settings_optparse_callback +from mopidy import audio, core, exceptions, settings +from mopidy.utils import ( + deps, importing, log, path, process, settings as settings_utils) logger = logging.getLogger('mopidy.main') @@ -90,11 +89,12 @@ def parse_options(): help='save debug log to "./mopidy.log"') parser.add_option( '--list-settings', - action='callback', callback=list_settings_optparse_callback, + action='callback', + callback=settings_utils.list_settings_optparse_callback, help='list current settings') parser.add_option( '--list-deps', - action='callback', callback=list_deps_optparse_callback, + action='callback', callback=deps.list_deps_optparse_callback, help='list dependencies and their versions') return parser.parse_args(args=mopidy_args)[0] @@ -131,11 +131,11 @@ def stop_audio(): def setup_backend(audio): - return utils.get_class(settings.BACKENDS[0]).start(audio=audio).proxy() + return importing.get_class(settings.BACKENDS[0]).start(audio=audio).proxy() def stop_backend(): - process.stop_actors_by_class(utils.get_class(settings.BACKENDS[0])) + process.stop_actors_by_class(importing.get_class(settings.BACKENDS[0])) def setup_core(audio, backend): @@ -149,7 +149,7 @@ def stop_core(): def setup_frontends(core): for frontend_class_name in settings.FRONTENDS: try: - utils.get_class(frontend_class_name).start(core=core) + importing.get_class(frontend_class_name).start(core=core) except exceptions.OptionalDependencyError as ex: logger.info(u'Disabled: %s (%s)', frontend_class_name, ex) @@ -157,7 +157,8 @@ def setup_frontends(core): def stop_frontends(): for frontend_class_name in settings.FRONTENDS: try: - process.stop_actors_by_class(utils.get_class(frontend_class_name)) + frontend_class = importing.get_class(frontend_class_name) + process.stop_actors_by_class(frontend_class) except exceptions.OptionalDependencyError: pass diff --git a/mopidy/audio/actor.py b/mopidy/audio/actor.py index 4a0b0000..77b451d7 100644 --- a/mopidy/audio/actor.py +++ b/mopidy/audio/actor.py @@ -7,7 +7,7 @@ import logging from pykka.actor import ThreadingActor -from mopidy import settings, utils +from mopidy import settings from mopidy.utils import process from . import mixers @@ -320,7 +320,7 @@ class Audio(ThreadingActor): new_scale = (0, 100) old_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) - return utils.rescale(avg_volume, old=old_scale, new=new_scale) + return self._rescale(avg_volume, old=old_scale, new=new_scale) def set_volume(self, volume): """ @@ -341,13 +341,20 @@ class Audio(ThreadingActor): new_scale = ( self._mixer_track.min_volume, self._mixer_track.max_volume) - volume = utils.rescale(volume, old=old_scale, new=new_scale) + volume = self._rescale(volume, old=old_scale, new=new_scale) volumes = (volume,) * self._mixer_track.num_channels self._mixer.set_volume(self._mixer_track, volumes) return self._mixer.get_volume(self._mixer_track) == volumes + def _rescale(self, value, old=None, new=None): + """Convert value between scales.""" + new_min, new_max = new + old_min, old_max = old + scaling = float(new_max - new_min) / (old_max - old_min) + return round(scaling * (value - old_min) + new_min) + def set_metadata(self, track): """ Set track metadata for currently playing song. diff --git a/mopidy/backends/local/translator.py b/mopidy/backends/local/translator.py index fbdace15..73b97989 100644 --- a/mopidy/backends/local/translator.py +++ b/mopidy/backends/local/translator.py @@ -3,7 +3,7 @@ import logging logger = logging.getLogger('mopidy.backends.local.translator') from mopidy.models import Track, Artist, Album -from mopidy.utils import locale_decode +from mopidy.utils.encoding import locale_decode from mopidy.utils.path import path_to_uri diff --git a/mopidy/frontends/mpd/actor.py b/mopidy/frontends/mpd/actor.py index b90f7c86..167fb1d6 100644 --- a/mopidy/frontends/mpd/actor.py +++ b/mopidy/frontends/mpd/actor.py @@ -5,7 +5,7 @@ from pykka import registry, actor from mopidy import core, settings from mopidy.frontends.mpd import session -from mopidy.utils import locale_decode, network, process +from mopidy.utils import encoding, network, process logger = logging.getLogger('mopidy.frontends.mpd') @@ -37,7 +37,8 @@ class MpdFrontend(actor.ThreadingActor, core.CoreListener): max_connections=settings.MPD_SERVER_MAX_CONNECTIONS) except IOError as error: logger.error( - u'MPD server startup failed: %s', locale_decode(error)) + u'MPD server startup failed: %s', + encoding.locale_decode(error)) sys.exit(1) logger.info(u'MPD server running at [%s]:%s', hostname, port) diff --git a/mopidy/frontends/mpd/dispatcher.py b/mopidy/frontends/mpd/dispatcher.py index d7ba8cdf..ae51d270 100644 --- a/mopidy/frontends/mpd/dispatcher.py +++ b/mopidy/frontends/mpd/dispatcher.py @@ -5,7 +5,6 @@ from pykka import ActorDeadError from mopidy import settings from mopidy.frontends.mpd import exceptions, protocol -from mopidy.utils import flatten logger = logging.getLogger('mopidy.frontends.mpd.dispatcher') @@ -187,10 +186,19 @@ class MpdDispatcher(object): if result is None: return [] if isinstance(result, set): - return flatten(list(result)) + return self._flatten(list(result)) if not isinstance(result, list): return [result] - return flatten(result) + return self._flatten(result) + + def _flatten(self, the_list): + result = [] + for element in the_list: + if isinstance(element, list): + result.extend(self._flatten(element)) + else: + result.append(element) + return result def _format_lines(self, line): if isinstance(line, dict): diff --git a/mopidy/utils/__init__.py b/mopidy/utils/__init__.py index 839e4f79..e69de29b 100644 --- a/mopidy/utils/__init__.py +++ b/mopidy/utils/__init__.py @@ -1,52 +0,0 @@ -from __future__ import division - -import locale -import logging -import sys - -logger = logging.getLogger('mopidy.utils') - - -# TODO: use itertools.chain.from_iterable(the_list)? -def flatten(the_list): - result = [] - for element in the_list: - if isinstance(element, list): - result.extend(flatten(element)) - else: - result.append(element) - return result - - -def rescale(v, old=None, new=None): - """Convert value between scales.""" - new_min, new_max = new - old_min, old_max = old - scaling = float(new_max - new_min) / (old_max - old_min) - return round(scaling * (v - old_min) + new_min) - - -def import_module(name): - __import__(name) - return sys.modules[name] - - -def get_class(name): - logger.debug('Loading: %s', name) - if '.' not in name: - raise ImportError("Couldn't load: %s" % name) - module_name = name[:name.rindex('.')] - cls_name = name[name.rindex('.') + 1:] - try: - module = import_module(module_name) - cls = getattr(module, cls_name) - except (ImportError, AttributeError): - raise ImportError("Couldn't load: %s" % name) - return cls - - -def locale_decode(bytestr): - try: - return unicode(bytestr) - except UnicodeError: - return str(bytestr).decode(locale.getpreferredencoding()) diff --git a/mopidy/utils/encoding.py b/mopidy/utils/encoding.py new file mode 100644 index 00000000..888896c5 --- /dev/null +++ b/mopidy/utils/encoding.py @@ -0,0 +1,8 @@ +import locale + + +def locale_decode(bytestr): + try: + return unicode(bytestr) + except UnicodeError: + return str(bytestr).decode(locale.getpreferredencoding()) diff --git a/mopidy/utils/importing.py b/mopidy/utils/importing.py new file mode 100644 index 00000000..3df6abe4 --- /dev/null +++ b/mopidy/utils/importing.py @@ -0,0 +1,23 @@ +import logging +import sys + +logger = logging.getLogger('mopidy.utils') + + +def import_module(name): + __import__(name) + return sys.modules[name] + + +def get_class(name): + logger.debug('Loading: %s', name) + if '.' not in name: + raise ImportError("Couldn't load: %s" % name) + module_name = name[:name.rindex('.')] + cls_name = name[name.rindex('.') + 1:] + try: + module = import_module(module_name) + cls = getattr(module, cls_name) + except (ImportError, AttributeError): + raise ImportError("Couldn't load: %s" % name) + return cls diff --git a/mopidy/utils/network.py b/mopidy/utils/network.py index 2a637c9b..dc303399 100644 --- a/mopidy/utils/network.py +++ b/mopidy/utils/network.py @@ -9,7 +9,7 @@ from pykka import ActorDeadError from pykka.actor import ThreadingActor from pykka.registry import ActorRegistry -from mopidy.utils import locale_decode +from mopidy.utils import encoding logger = logging.getLogger('mopidy.utils.server') @@ -30,7 +30,7 @@ def try_ipv6_socket(): logger.debug( u'Platform supports IPv6, but socket creation failed, ' u'disabling: %s', - locale_decode(error)) + encoding.locale_decode(error)) return False diff --git a/tests/utils/decode_test.py b/tests/utils/encoding_test.py similarity index 90% rename from tests/utils/decode_test.py rename to tests/utils/encoding_test.py index edbfe651..da50d9be 100644 --- a/tests/utils/decode_test.py +++ b/tests/utils/encoding_test.py @@ -1,11 +1,11 @@ import mock -from mopidy.utils import locale_decode +from mopidy.utils.encoding import locale_decode from tests import unittest -@mock.patch('mopidy.utils.locale.getpreferredencoding') +@mock.patch('mopidy.utils.encoding.locale.getpreferredencoding') class LocaleDecodeTest(unittest.TestCase): def test_can_decode_utf8_strings_with_french_content(self, mock): mock.return_value = 'UTF-8' diff --git a/tests/utils/init_test.py b/tests/utils/importing_test.py similarity index 68% rename from tests/utils/init_test.py rename to tests/utils/importing_test.py index bdd0adc5..271f9dbe 100644 --- a/tests/utils/init_test.py +++ b/tests/utils/importing_test.py @@ -1,4 +1,4 @@ -from mopidy import utils +from mopidy.utils import importing from tests import unittest @@ -6,22 +6,22 @@ from tests import unittest class GetClassTest(unittest.TestCase): def test_loading_module_that_does_not_exist(self): with self.assertRaises(ImportError): - utils.get_class('foo.bar.Baz') + importing.get_class('foo.bar.Baz') def test_loading_class_that_does_not_exist(self): with self.assertRaises(ImportError): - utils.get_class('unittest.FooBarBaz') + importing.get_class('unittest.FooBarBaz') def test_loading_incorrect_class_path(self): with self.assertRaises(ImportError): - utils.get_class('foobarbaz') + importing.get_class('foobarbaz') def test_import_error_message_contains_complete_class_path(self): try: - utils.get_class('foo.bar.Baz') + importing.get_class('foo.bar.Baz') except ImportError as e: self.assertIn('foo.bar.Baz', str(e)) def test_loading_existing_class(self): - cls = utils.get_class('unittest.TestCase') + cls = importing.get_class('unittest.TestCase') self.assertEqual(cls.__name__, 'TestCase')