Merge pull request #435 from jodal/feature/drop-python-2.6

Drop Python 2.6 support
This commit is contained in:
Thomas Adamcik 2013-04-29 12:44:05 -07:00
commit 3f895159b2
60 changed files with 179 additions and 218 deletions

View File

@ -9,6 +9,11 @@ v0.15.0 (UNRELEASED)
(no description yet)
**Dependencies**
- Mopidy no longer supports Python 2.6. Currently, the only Python version
supported by Mopidy is Python 2.7.
v0.14.1 (2013-04-28)
====================

View File

@ -131,12 +131,6 @@ Pip.
PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages mopidy
Note that you need to replace ``python2.7`` with ``python2.6`` in the above
``PYTHONPATH`` examples if you are using Python 2.6. To find your Python
version, run::
python --version
#. Next up, you need to install some Python packages. To do so, we use Pip. If
you don't have the ``pip`` command, you can install it now::
@ -157,7 +151,7 @@ Otherwise: Install from source using Pip
If you are on on Linux, but can't install from the APT archive or from AUR, you
can install Mopidy from PyPI using Pip.
#. First of all, you need Python >= 2.6, < 3. Check if you have Python and what
#. First of all, you need Python 2.7. Check if you have Python and what
version by running::
python --version

View File

@ -9,9 +9,9 @@ import warnings
import pykka
if not (2, 6) <= sys.version_info < (3,):
if not (2, 7) <= sys.version_info < (3,):
sys.exit(
'Mopidy requires Python >= 2.6, < 3, but found %s' %
'Mopidy requires Python >= 2.7, < 3, but found %s' %
'.'.join(map(str, sys.version_info[:3])))
if (isinstance(pykka.__version__, basestring)

View File

@ -139,35 +139,33 @@ def parse_options():
optparse.Option.TYPES += ('config_override',)
optparse.Option.TYPE_CHECKER['config_override'] = check_config_override
# NOTE First argument to add_option must be bytestrings on Python < 2.6.2
# See https://github.com/mopidy/mopidy/issues/302 for details
parser.add_option(
b'-q', '--quiet',
'-q', '--quiet',
action='store_const', const=0, dest='verbosity_level',
help='less output (warning level)')
parser.add_option(
b'-v', '--verbose',
'-v', '--verbose',
action='count', default=1, dest='verbosity_level',
help='more output (debug level)')
parser.add_option(
b'--save-debug-log',
'--save-debug-log',
action='store_true', dest='save_debug_log',
help='save debug log to "./mopidy.log"')
parser.add_option(
b'--show-config',
'--show-config',
action='callback', callback=show_config_callback,
help='show current config')
parser.add_option(
b'--show-deps',
'--show-deps',
action='callback', callback=deps.show_deps_optparse_callback,
help='show dependencies and their versions')
parser.add_option(
b'--config',
'--config',
action='store', dest='config',
default=b'$XDG_CONFIG_DIR/mopidy/mopidy.conf',
help='config files to use, colon seperated, later files override')
parser.add_option(
b'-o', b'--option',
'-o', '--option',
action='append', dest='overrides', type='config_override',
help='`section/key=value` values to override config options')
return parser.parse_args(args=mopidy_args)[0]

View File

@ -100,9 +100,6 @@ def _convert_mpd_data(data, tracks, music_dir):
if not data:
return
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details.
track_kwargs = {}
album_kwargs = {}
artist_kwargs = {}
@ -110,51 +107,51 @@ def _convert_mpd_data(data, tracks, music_dir):
if 'track' in data:
if '/' in data['track']:
album_kwargs[b'num_tracks'] = int(data['track'].split('/')[1])
track_kwargs[b'track_no'] = int(data['track'].split('/')[0])
album_kwargs['num_tracks'] = int(data['track'].split('/')[1])
track_kwargs['track_no'] = int(data['track'].split('/')[0])
else:
track_kwargs[b'track_no'] = int(data['track'])
track_kwargs['track_no'] = int(data['track'])
if 'artist' in data:
artist_kwargs[b'name'] = data['artist']
albumartist_kwargs[b'name'] = data['artist']
artist_kwargs['name'] = data['artist']
albumartist_kwargs['name'] = data['artist']
if 'albumartist' in data:
albumartist_kwargs[b'name'] = data['albumartist']
albumartist_kwargs['name'] = data['albumartist']
if 'album' in data:
album_kwargs[b'name'] = data['album']
album_kwargs['name'] = data['album']
if 'title' in data:
track_kwargs[b'name'] = data['title']
track_kwargs['name'] = data['title']
if 'date' in data:
track_kwargs[b'date'] = data['date']
track_kwargs['date'] = data['date']
if 'musicbrainz_trackid' in data:
track_kwargs[b'musicbrainz_id'] = data['musicbrainz_trackid']
track_kwargs['musicbrainz_id'] = data['musicbrainz_trackid']
if 'musicbrainz_albumid' in data:
album_kwargs[b'musicbrainz_id'] = data['musicbrainz_albumid']
album_kwargs['musicbrainz_id'] = data['musicbrainz_albumid']
if 'musicbrainz_artistid' in data:
artist_kwargs[b'musicbrainz_id'] = data['musicbrainz_artistid']
artist_kwargs['musicbrainz_id'] = data['musicbrainz_artistid']
if 'musicbrainz_albumartistid' in data:
albumartist_kwargs[b'musicbrainz_id'] = (
albumartist_kwargs['musicbrainz_id'] = (
data['musicbrainz_albumartistid'])
if artist_kwargs:
artist = Artist(**artist_kwargs)
track_kwargs[b'artists'] = [artist]
track_kwargs['artists'] = [artist]
if albumartist_kwargs:
albumartist = Artist(**albumartist_kwargs)
album_kwargs[b'artists'] = [albumartist]
album_kwargs['artists'] = [albumartist]
if album_kwargs:
album = Album(**album_kwargs)
track_kwargs[b'album'] = album
track_kwargs['album'] = album
if data['file'][0] == '/':
path = data['file'][1:]
@ -167,9 +164,9 @@ def _convert_mpd_data(data, tracks, music_dir):
# Make sure we only pass bytestrings to path_to_uri to avoid implicit
# decoding of bytestrings to unicode strings
track_kwargs[b'uri'] = path_to_uri(music_dir, path)
track_kwargs['uri'] = path_to_uri(music_dir, path)
track_kwargs[b'length'] = int(data.get('time', 0)) * 1000
track_kwargs['length'] = int(data.get('time', 0)) * 1000
track = Track(**track_kwargs)
tracks.add(track)

View File

@ -18,15 +18,13 @@ class MpdFrontend(pykka.ThreadingActor, CoreListener):
hostname = network.format_hostname(config['mpd']['hostname'])
port = config['mpd']['port']
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details.
try:
network.Server(
hostname, port,
protocol=session.MpdSession,
protocol_kwargs={
b'config': config,
b'core': core,
'config': config,
'core': core,
},
max_connections=config['mpd']['max_connections'],
timeout=config['mpd']['connection_timeout'])

View File

@ -56,12 +56,7 @@ def handle_request(pattern, auth_required=True):
if match is not None:
mpd_commands.add(
MpdCommand(name=match.group(), auth_required=auth_required))
# NOTE Make pattern a bytestring to get bytestring keys in the dict
# returned from matches.groupdict(), which is again used as a **kwargs
# dict. This is needed to work on Python < 2.6.5.
# See https://github.com/mopidy/mopidy/issues/302 for details.
bytestring_pattern = pattern.encode('utf-8')
compiled_pattern = re.compile(bytestring_pattern, flags=re.UNICODE)
compiled_pattern = re.compile(pattern, flags=re.UNICODE)
if compiled_pattern in request_handlers:
raise ValueError('Tried to redefine handler for %s with %s' % (
pattern, func))

View File

@ -139,8 +139,6 @@ def query_from_mpd_list_format(field, mpd_query):
"""
Converts an MPD ``list`` query to a Mopidy query.
"""
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
if mpd_query is None:
return {}
try:
@ -156,7 +154,7 @@ def query_from_mpd_list_format(field, mpd_query):
if field == 'album':
if not tokens[0]:
raise ValueError
return {b'artist': [tokens[0]]} # See above NOTE
return {'artist': [tokens[0]]} # See above NOTE
else:
raise MpdArgError(
'should be "Album" for 3 arguments', command='list')

View File

@ -66,15 +66,13 @@ class ImmutableObject(object):
:type values: dict
:rtype: new instance of the model being copied
"""
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
data = {}
for key in self.__dict__.keys():
public_key = key.lstrip('_')
data[str(public_key)] = values.pop(public_key, self.__dict__[key])
data[public_key] = values.pop(public_key, self.__dict__[key])
for key in values.keys():
if hasattr(self, key):
data[str(key)] = values.pop(key)
data[key] = values.pop(key)
if values:
raise TypeError(
'copy() got an unexpected keyword argument "%s"' % key)
@ -127,15 +125,13 @@ def model_json_decoder(dct):
{u'a_track': Track(artists=[], name=u'name')}
"""
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details.
if '__model__' in dct:
model_name = dct.pop('__model__')
cls = globals().get(model_name, None)
if issubclass(cls, ImmutableObject):
kwargs = {}
for key, value in dct.items():
kwargs[str(key)] = value
kwargs[key] = value
return cls(**kwargs)
return dct
@ -208,10 +204,8 @@ class Album(ImmutableObject):
# actual usage of this field with more than one image.
def __init__(self, *args, **kwargs):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
self.__dict__[b'artists'] = frozenset(kwargs.pop('artists', []))
self.__dict__[b'images'] = frozenset(kwargs.pop('images', []))
self.__dict__['artists'] = frozenset(kwargs.pop('artists', []))
self.__dict__['images'] = frozenset(kwargs.pop('images', []))
super(Album, self).__init__(*args, **kwargs)
@ -270,9 +264,7 @@ class Track(ImmutableObject):
musicbrainz_id = None
def __init__(self, *args, **kwargs):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
self.__dict__[b'artists'] = frozenset(kwargs.pop('artists', []))
self.__dict__['artists'] = frozenset(kwargs.pop('artists', []))
super(Track, self).__init__(*args, **kwargs)
@ -304,11 +296,9 @@ class TlTrack(ImmutableObject):
track = None
def __init__(self, *args, **kwargs):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
if len(args) == 2 and len(kwargs) == 0:
kwargs[b'tlid'] = args[0]
kwargs[b'track'] = args[1]
kwargs['tlid'] = args[0]
kwargs['track'] = args[1]
args = []
super(TlTrack, self).__init__(*args, **kwargs)
@ -343,9 +333,7 @@ class Playlist(ImmutableObject):
last_modified = None
def __init__(self, *args, **kwargs):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
self.__dict__[b'tracks'] = tuple(kwargs.pop('tracks', []))
self.__dict__['tracks'] = tuple(kwargs.pop('tracks', []))
super(Playlist, self).__init__(*args, **kwargs)
# TODO: def insert(self, pos, track): ... ?
@ -381,9 +369,7 @@ class SearchResult(ImmutableObject):
albums = tuple()
def __init__(self, *args, **kwargs):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details
self.__dict__[b'tracks'] = tuple(kwargs.pop('tracks', []))
self.__dict__[b'artists'] = tuple(kwargs.pop('artists', []))
self.__dict__[b'albums'] = tuple(kwargs.pop('albums', []))
self.__dict__['tracks'] = tuple(kwargs.pop('tracks', []))
self.__dict__['artists'] = tuple(kwargs.pop('artists', []))
self.__dict__['albums'] = tuple(kwargs.pop('albums', []))
super(SearchResult, self).__init__(*args, **kwargs)

View File

@ -90,14 +90,12 @@ def main():
def parse_options():
parser = optparse.OptionParser(
version='Mopidy %s' % versioning.get_version())
# NOTE First argument to add_option must be bytestrings on Python < 2.6.2
# See https://github.com/mopidy/mopidy/issues/302 for details
parser.add_option(
b'-q', '--quiet',
'-q', '--quiet',
action='store_const', const=0, dest='verbosity_level',
help='less output (warning level)')
parser.add_option(
b'-v', '--verbose',
'-v', '--verbose',
action='count', default=1, dest='verbosity_level',
help='more output (debug level)')
return parser.parse_args(args=mopidy_args)[0]
@ -109,12 +107,9 @@ def translator(data):
artist_kwargs = {}
track_kwargs = {}
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details.
def _retrieve(source_key, target_key, target):
if source_key in data:
target[str(target_key)] = data[source_key]
target[target_key] = data[source_key]
_retrieve(gst.TAG_ALBUM, 'name', album_kwargs)
_retrieve(gst.TAG_TRACK_COUNT, 'num_tracks', album_kwargs)
@ -127,7 +122,7 @@ def translator(data):
except ValueError:
pass # Ignore invalid dates
else:
track_kwargs[b'date'] = date.isoformat()
track_kwargs['date'] = date.isoformat()
_retrieve(gst.TAG_TITLE, 'name', track_kwargs)
_retrieve(gst.TAG_TRACK_NUMBER, 'track_no', track_kwargs)
@ -141,12 +136,12 @@ def translator(data):
'musicbrainz-albumartistid', 'musicbrainz_id', albumartist_kwargs)
if albumartist_kwargs:
album_kwargs[b'artists'] = [Artist(**albumartist_kwargs)]
album_kwargs['artists'] = [Artist(**albumartist_kwargs)]
track_kwargs[b'uri'] = data['uri']
track_kwargs[b'length'] = data[gst.TAG_DURATION]
track_kwargs[b'album'] = Album(**album_kwargs)
track_kwargs[b'artists'] = [Artist(**artist_kwargs)]
track_kwargs['uri'] = data['uri']
track_kwargs['length'] = data[gst.TAG_DURATION]
track_kwargs['album'] = Album(**album_kwargs)
track_kwargs['artists'] = [Artist(**artist_kwargs)]
return Track(**track_kwargs)

View File

@ -3,5 +3,3 @@ flake8
mock >= 1.0
nose
pylint
tox
unittest2

View File

@ -3,11 +3,6 @@ from __future__ import unicode_literals
import os
import sys
if sys.version_info < (2, 7):
import unittest2 as unittest
else:
import unittest # noqa
def path_to_data_dir(name):
if not isinstance(name, bytes):

View File

@ -1,5 +1,7 @@
from __future__ import unicode_literals
import unittest
import pygst
pygst.require('0.10')
import gst
@ -9,7 +11,7 @@ import pykka
from mopidy import audio
from mopidy.utils.path import path_to_uri
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
class AudioTest(unittest.TestCase):

View File

@ -1,11 +1,10 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy import audio
from tests import unittest
class AudioListenerTest(unittest.TestCase):
def setUp(self):

View File

@ -1,11 +1,13 @@
from __future__ import unicode_literals
import unittest
import pykka
from mopidy import core
from mopidy.models import Track, Album, Artist
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
class LibraryControllerTest(object):

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals
import mock
import random
import time
import unittest
import pykka
@ -10,7 +11,6 @@ from mopidy import audio, core
from mopidy.core import PlaybackState
from mopidy.models import Track
from tests import unittest
from tests.backends.base import populate_tracklist
# TODO Test 'playlist repeat', e.g. repeat=1,single=0

View File

@ -1,12 +1,12 @@
from __future__ import unicode_literals
import unittest
import pykka
from mopidy import audio, core
from mopidy.models import Playlist
from tests import unittest
class PlaylistsControllerTest(object):
config = {}

View File

@ -1,11 +1,10 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.backends.listener import BackendListener
from tests import unittest
class BackendListenerTest(unittest.TestCase):
def setUp(self):

View File

@ -1,8 +1,10 @@
from __future__ import unicode_literals
import unittest
from mopidy.backends.local import actor
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
from tests.backends.base import events

View File

@ -1,8 +1,10 @@
from __future__ import unicode_literals
import unittest
from mopidy.backends.local import actor
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
from tests.backends.base.library import LibraryControllerTest

View File

@ -1,11 +1,13 @@
from __future__ import unicode_literals
import unittest
from mopidy.backends.local import actor
from mopidy.core import PlaybackState
from mopidy.models import Track
from mopidy.utils.path import path_to_uri
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
from tests.backends.base.playback import PlaybackControllerTest
from tests.backends.local import generate_song

View File

@ -3,12 +3,13 @@ from __future__ import unicode_literals
import os
import shutil
import tempfile
import unittest
from mopidy.backends.local import actor
from mopidy.models import Track
from mopidy.utils.path import path_to_uri
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
from tests.backends.base.playlists import (
PlaylistsControllerTest)
from tests.backends.local import generate_song

View File

@ -1,9 +1,11 @@
from __future__ import unicode_literals
import unittest
from mopidy.backends.local import actor
from mopidy.models import Track
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
from tests.backends.base.tracklist import TracklistControllerTest
from tests.backends.local import generate_song

View File

@ -4,12 +4,13 @@ from __future__ import unicode_literals
import os
import tempfile
import unittest
from mopidy.backends.local.translator import parse_m3u, parse_mpd_tag_cache
from mopidy.models import Track, Artist, Album
from mopidy.utils.path import path_to_uri
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
data_dir = path_to_data_dir('')
song1_path = path_to_data_dir('song1.mp3')

View File

@ -3,10 +3,11 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy import config
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
class LoadConfigTest(unittest.TestCase):
@ -111,9 +112,12 @@ class ParseOverrideTest(unittest.TestCase):
def test_valid_override(self):
expected = (b'section', b'key', b'value')
self.assertEqual(expected, config.parse_override(b'section/key=value'))
self.assertEqual(expected, config.parse_override(b'section/key=value '))
self.assertEqual(expected, config.parse_override(b'section/key =value'))
self.assertEqual(expected, config.parse_override(b'section /key=value'))
self.assertEqual(
expected, config.parse_override(b'section/key=value '))
self.assertEqual(
expected, config.parse_override(b'section/key =value'))
self.assertEqual(
expected, config.parse_override(b'section /key=value'))
def test_valid_override_is_bytes(self):
section, key, value = config.parse_override(b'section/key=value')

View File

@ -2,10 +2,11 @@ from __future__ import unicode_literals
import logging
import mock
import unittest
from mopidy.config import schemas, types
from mopidy.config import schemas
from tests import unittest, any_unicode
from tests import any_unicode
class ConfigSchemaTest(unittest.TestCase):

View File

@ -6,11 +6,10 @@ import logging
import mock
import socket
import sys
import unittest
from mopidy.config import types
from tests import unittest
# TODO: DecodeTest and EncodeTest

View File

@ -1,8 +1,8 @@
from __future__ import unicode_literals
from mopidy.config import validators
import unittest
from tests import unittest
from mopidy.config import validators
class ValidateChoiceTest(unittest.TestCase):

View File

@ -1,12 +1,12 @@
from __future__ import unicode_literals
import mock
import unittest
import pykka
from mopidy.core import Core
from tests import unittest
class CoreActorTest(unittest.TestCase):
def setUp(self):

View File

@ -1,14 +1,14 @@
from __future__ import unicode_literals
import mock
import unittest
import pykka
from mopidy import core
from mopidy.backends import dummy
from mopidy.models import Track
from tests import unittest
@mock.patch.object(core.CoreListener, 'send')
class BackendEventsTest(unittest.TestCase):

View File

@ -1,13 +1,12 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.backends import base
from mopidy.core import Core
from mopidy.models import SearchResult, Track
from tests import unittest
class CoreLibraryTest(unittest.TestCase):
def setUp(self):

View File

@ -1,12 +1,11 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.core import CoreListener, PlaybackState
from mopidy.models import Playlist, TlTrack
from tests import unittest
class CoreListenerTest(unittest.TestCase):
def setUp(self):

View File

@ -1,13 +1,12 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.backends import base
from mopidy.core import Core, PlaybackState
from mopidy.models import Track
from tests import unittest
class CorePlaybackTest(unittest.TestCase):
def setUp(self):

View File

@ -1,13 +1,12 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.backends import base
from mopidy.core import Core
from mopidy.models import Playlist, Track
from tests import unittest
class PlaylistsTest(unittest.TestCase):
def setUp(self):

View File

@ -1,13 +1,12 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.backends import base
from mopidy.core import Core
from mopidy.models import Track
from tests import unittest
class TracklistTest(unittest.TestCase):
def setUp(self):

View File

@ -1,8 +1,8 @@
from __future__ import unicode_literals
from mopidy import exceptions
import unittest
from tests import unittest
from mopidy import exceptions
class ExceptionsTest(unittest.TestCase):

View File

@ -1,8 +1,8 @@
from __future__ import unicode_literals
from mopidy import config, ext
import unittest
from tests import unittest
from mopidy import config, ext
class ExtensionTest(unittest.TestCase):

View File

@ -1,6 +1,8 @@
from __future__ import unicode_literals
import json
import mock
import unittest
try:
import cherrypy
@ -15,9 +17,6 @@ except ImportError:
if cherrypy and ws4py:
from mopidy.frontends.http import actor
import mock
from tests import unittest
@unittest.skipUnless(cherrypy, 'cherrypy not found')
@unittest.skipUnless(ws4py, 'ws4py not found')

View File

@ -1,5 +1,7 @@
from __future__ import unicode_literals
import unittest
import pykka
from mopidy import core
@ -8,8 +10,6 @@ from mopidy.frontends.mpd.dispatcher import MpdDispatcher
from mopidy.frontends.mpd.exceptions import MpdAckError
from mopidy.frontends.mpd.protocol import request_handlers, handle_request
from tests import unittest
class MpdDispatcherTest(unittest.TestCase):
def setUp(self):

View File

@ -1,11 +1,11 @@
from __future__ import unicode_literals
import unittest
from mopidy.frontends.mpd.exceptions import (
MpdAckError, MpdPermissionError, MpdUnknownCommand, MpdSystemError,
MpdNotImplemented)
from tests import unittest
class MpdExceptionsTest(unittest.TestCase):
def test_key_error_wrapped_in_mpd_ack_error(self):

View File

@ -1,14 +1,14 @@
from __future__ import unicode_literals
import mock
import unittest
import pykka
from mopidy import core
from mopidy.backends import dummy
from mopidy.frontends.mpd import session
from tests import unittest
class MockConnection(mock.Mock):
def __init__(self, *args, **kwargs):

View File

@ -1,9 +1,10 @@
from __future__ import unicode_literals
import unittest
from mopidy.core import PlaybackState
from mopidy.models import Track
from tests import unittest
from tests.frontends.mpd import protocol

View File

@ -1,5 +1,7 @@
from __future__ import unicode_literals
import unittest
import pykka
from mopidy import core
@ -9,8 +11,6 @@ from mopidy.frontends.mpd import dispatcher
from mopidy.frontends.mpd.protocol import status
from mopidy.models import Track
from tests import unittest
PAUSED = PlaybackState.PAUSED
PLAYING = PlaybackState.PLAYING

View File

@ -2,13 +2,12 @@ from __future__ import unicode_literals
import datetime
import os
import unittest
from mopidy.utils.path import mtime, uri_to_path
from mopidy.frontends.mpd import translator, protocol
from mopidy.models import Album, Artist, TlTrack, Playlist, Track
from tests import unittest
class TrackMpdFormatTest(unittest.TestCase):
track = Track(

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals
import mock
import unittest
try:
import dbus
@ -12,8 +13,6 @@ from mopidy.models import Playlist, TlTrack
if dbus:
from mopidy.frontends.mpris import actor, objects
from tests import unittest
@unittest.skipUnless(dbus, 'dbus not found')
class BackendEventsTest(unittest.TestCase):

View File

@ -1,6 +1,8 @@
from __future__ import unicode_literals
import mock
import unittest
import pykka
try:
@ -16,8 +18,6 @@ from mopidy.models import Album, Artist, Track
if dbus:
from mopidy.frontends.mpris import objects
from tests import unittest
PLAYING = PlaybackState.PLAYING
PAUSED = PlaybackState.PAUSED
STOPPED = PlaybackState.STOPPED

View File

@ -1,8 +1,9 @@
from __future__ import unicode_literals
import datetime
import mock
import unittest
import pykka
try:
@ -18,8 +19,6 @@ from mopidy.models import Track
if dbus:
from mopidy.frontends.mpris import objects
from tests import unittest
@unittest.skipUnless(dbus, 'dbus not found')
class PlayerInterfaceTest(unittest.TestCase):

View File

@ -1,6 +1,8 @@
from __future__ import unicode_literals
import mock
import unittest
import pykka
try:
@ -14,8 +16,6 @@ from mopidy.backends import dummy
if dbus:
from mopidy.frontends.mpris import objects
from tests import unittest
@unittest.skipUnless(dbus, 'dbus not found')
class RootInterfaceTest(unittest.TestCase):

View File

@ -3,11 +3,10 @@ from __future__ import unicode_literals
import os
import subprocess
import sys
import unittest
import mopidy
from tests import unittest
class HelpTest(unittest.TestCase):
def test_help_has_mopidy_options(self):

View File

@ -2,13 +2,12 @@ from __future__ import unicode_literals
import datetime
import json
import unittest
from mopidy.models import (
Artist, Album, TlTrack, Track, Playlist, SearchResult,
ModelJSONEncoder, model_json_decoder)
from tests import unittest
class GenericCopyTest(unittest.TestCase):
def compare(self, orig, other):

View File

@ -1,9 +1,11 @@
from __future__ import unicode_literals
import unittest
from mopidy.scanner import Scanner, translator
from mopidy.models import Track, Artist, Album
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
class FakeGstDate(object):
@ -32,40 +34,36 @@ class TranslatorTest(unittest.TestCase):
'musicbrainz-albumartistid': 'mbalbumartistid',
}
# NOTE: kwargs are explicitly made bytestrings to work on Python
# 2.6.0/2.6.1. See https://github.com/mopidy/mopidy/issues/302 for
# details.
self.album = {
b'name': 'albumname',
b'num_tracks': 2,
b'musicbrainz_id': 'mbalbumid',
'name': 'albumname',
'num_tracks': 2,
'musicbrainz_id': 'mbalbumid',
}
self.artist = {
b'name': 'name',
b'musicbrainz_id': 'mbartistid',
'name': 'name',
'musicbrainz_id': 'mbartistid',
}
self.albumartist = {
b'name': 'albumartistname',
b'musicbrainz_id': 'mbalbumartistid',
'name': 'albumartistname',
'musicbrainz_id': 'mbalbumartistid',
}
self.track = {
b'uri': 'uri',
b'name': 'trackname',
b'date': '2006-01-01',
b'track_no': 1,
b'length': 4531,
b'musicbrainz_id': 'mbtrackid',
'uri': 'uri',
'name': 'trackname',
'date': '2006-01-01',
'track_no': 1,
'length': 4531,
'musicbrainz_id': 'mbtrackid',
}
def build_track(self):
if self.albumartist:
self.album[b'artists'] = [Artist(**self.albumartist)]
self.track[b'album'] = Album(**self.album)
self.track[b'artists'] = [Artist(**self.artist)]
self.album['artists'] = [Artist(**self.albumartist)]
self.track['album'] = Album(**self.album)
self.track['artists'] = [Artist(**self.artist)]
return Track(**self.track)
def check(self):

View File

@ -1,18 +1,17 @@
from __future__ import unicode_literals
import platform
import mock
import unittest
import pygst
pygst.require('0.10')
import gst
import mock
import pkg_resources
from mopidy.utils import deps
from tests import unittest
class DepsTest(unittest.TestCase):
def test_format_dependency_list(self):

View File

@ -1,11 +1,10 @@
from __future__ import unicode_literals
import mock
import unittest
from mopidy.utils.encoding import locale_decode
from tests import unittest
@mock.patch('mopidy.utils.encoding.locale.getpreferredencoding')
class LocaleDecodeTest(unittest.TestCase):

View File

@ -1,16 +1,15 @@
from __future__ import unicode_literals
import json
import mock
import unittest
import pykka
import mock
from mopidy import core, models
from mopidy.backends import dummy
from mopidy.utils import jsonrpc
from tests import unittest
class Calculator(object):
def model(self):
@ -219,12 +218,10 @@ class JsonRpcSingleCommandTest(JsonRpcTestBase):
self.assertEqual(self.core.playback.get_volume().get(), 37)
def test_call_methods_with_named_params(self):
# NOTE kwargs dict keys must be bytestrings to work on Python < 2.6.5
# See https://github.com/mopidy/mopidy/issues/302 for details.
request = {
'jsonrpc': '2.0',
'method': 'core.playback.set_volume',
'params': {b'volume': 37},
'params': {'volume': 37},
'id': 1,
}
response = self.jrw.handle_data(request)

View File

@ -1,15 +1,17 @@
from __future__ import unicode_literals
import errno
import gobject
import logging
import pykka
import socket
from mock import patch, sentinel, Mock
import socket
import unittest
import gobject
import pykka
from mopidy.utils import network
from tests import unittest, any_int, any_unicode
from tests import any_int, any_unicode
class ConnectionTest(unittest.TestCase):

View File

@ -2,13 +2,12 @@
from __future__ import unicode_literals
import re
from mock import sentinel, Mock
import re
import unittest
from mopidy.utils import network
from tests import unittest
class LineProtocolTest(unittest.TestCase):
def setUp(self):

View File

@ -1,13 +1,15 @@
from __future__ import unicode_literals
import errno
import gobject
import socket
from mock import patch, sentinel, Mock
import socket
import unittest
import gobject
from mopidy.utils import network
from tests import unittest, any_int
from tests import any_int
class ServerTest(unittest.TestCase):

View File

@ -1,12 +1,11 @@
from __future__ import unicode_literals
import socket
from mock import patch, Mock
import socket
import unittest
from mopidy.utils import network
from tests import unittest
class FormatHostnameTest(unittest.TestCase):
@patch('mopidy.utils.network.has_ipv6', True)

View File

@ -2,15 +2,17 @@
from __future__ import unicode_literals
import glib
import os
import shutil
import sys
import tempfile
import unittest
import glib
from mopidy.utils import path
from tests import unittest, path_to_data_dir
from tests import path_to_data_dir
class GetOrCreateDirTest(unittest.TestCase):

View File

@ -1,11 +1,10 @@
from __future__ import unicode_literals
from distutils.version import StrictVersion as SV
import unittest
from mopidy import __version__
from tests import unittest
class VersionTest(unittest.TestCase):
def test_current_version_is_parsable_as_a_strict_version_number(self):