Merge pull request #435 from jodal/feature/drop-python-2.6
Drop Python 2.6 support
This commit is contained in:
commit
3f895159b2
@ -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)
|
||||
====================
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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]
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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'])
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -3,5 +3,3 @@ flake8
|
||||
mock >= 1.0
|
||||
nose
|
||||
pylint
|
||||
tox
|
||||
unittest2
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 = {}
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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')
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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):
|
||||
|
||||
Loading…
Reference in New Issue
Block a user