Merge pull request #901 from jodal/feature/python3-compat
Python 3 compatibility
This commit is contained in:
commit
88592ee17b
@ -43,7 +43,7 @@ available at http://localhost:6680/mywebclient/foo.html.
|
||||
|
||||
::
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
@ -95,7 +95,7 @@ Mopidy $version``.
|
||||
|
||||
::
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
@ -149,7 +149,7 @@ http://localhost:6680/mywebclient/.
|
||||
|
||||
::
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
"""Mopidy documentation build configuration file"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
@ -159,7 +159,7 @@ class that will connect the rest of the dots.
|
||||
|
||||
::
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import re
|
||||
from setuptools import setup, find_packages
|
||||
@ -255,7 +255,7 @@ default config in documentation without duplicating it.
|
||||
|
||||
This is ``mopidy_soundspot/__init__.py``::
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
@ -449,7 +449,7 @@ Python conventions
|
||||
In general, it would be nice if Mopidy extensions followed the same
|
||||
:ref:`codestyle` as Mopidy itself, as they're part of the same ecosystem. Among
|
||||
other things, the code style guide explains why all the above examples start
|
||||
with ``from __future__ import unicode_literals``.
|
||||
with ``from __future__ import absolute_import, unicode_literals``.
|
||||
|
||||
|
||||
Use of Mopidy APIs
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
import platform
|
||||
import sys
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import print_function, unicode_literals
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
# flake8: noqa
|
||||
from .actor import Audio
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
|
||||
class PlaybackState(object):
|
||||
|
||||
@ -4,7 +4,7 @@ This class implements the audio API in the simplest way possible. It is used in
|
||||
tests of the core and backends.
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import pykka
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy import listener
|
||||
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import ConfigParser as configparser
|
||||
import io
|
||||
|
||||
import gobject
|
||||
@ -9,6 +8,8 @@ import pygst
|
||||
pygst.require('0.10')
|
||||
import gst # noqa
|
||||
|
||||
from mopidy.compat import configparser
|
||||
|
||||
try:
|
||||
import xml.etree.cElementTree as elementtree
|
||||
except ImportError:
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, division, unicode_literals
|
||||
|
||||
import datetime
|
||||
import os
|
||||
@ -81,7 +81,7 @@ class Scanner(object):
|
||||
def _collect(self):
|
||||
"""Polls for messages to collect data."""
|
||||
start = time.time()
|
||||
timeout_s = self._timeout_ms / float(1000)
|
||||
timeout_s = self._timeout_ms / 1000.
|
||||
tags = {}
|
||||
|
||||
while time.time() - start < timeout_s:
|
||||
|
||||
@ -1,9 +1,11 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import pygst
|
||||
pygst.require('0.10')
|
||||
import gst # noqa
|
||||
|
||||
from mopidy import compat
|
||||
|
||||
|
||||
def calculate_duration(num_samples, sample_rate):
|
||||
"""Determine duration of samples using GStreamer helper for precise
|
||||
@ -18,7 +20,7 @@ def create_buffer(data, capabilites=None, timestamp=None, duration=None):
|
||||
"""
|
||||
buffer_ = gst.Buffer(data)
|
||||
if capabilites:
|
||||
if isinstance(capabilites, basestring):
|
||||
if isinstance(capabilites, compat.string_types):
|
||||
capabilites = gst.caps_from_string(capabilites)
|
||||
buffer_.set_caps(capabilites)
|
||||
if timestamp:
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import copy
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ This backend implements the backend API in the simplest way possible. It is
|
||||
used in tests of the frontends.
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import pykka
|
||||
|
||||
@ -44,7 +44,7 @@ class DummyLibraryProvider(backend.LibraryProvider):
|
||||
return self.dummy_find_exact_result
|
||||
|
||||
def lookup(self, uri):
|
||||
return filter(lambda t: uri == t.uri, self.dummy_library)
|
||||
return [t for t in self.dummy_library if uri == t.uri]
|
||||
|
||||
def refresh(self, uri=None):
|
||||
pass
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import print_function, unicode_literals
|
||||
from __future__ import absolute_import, print_function, unicode_literals
|
||||
|
||||
import argparse
|
||||
import collections
|
||||
|
||||
30
mopidy/compat.py
Normal file
30
mopidy/compat.py
Normal file
@ -0,0 +1,30 @@
|
||||
import sys
|
||||
|
||||
PY2 = sys.version_info[0] == 2
|
||||
PY3 = sys.version_info[0] == 3
|
||||
|
||||
if PY2:
|
||||
import ConfigParser as configparser # noqa
|
||||
import Queue as queue # noqa
|
||||
import thread # noqa
|
||||
|
||||
string_types = basestring
|
||||
text_type = unicode
|
||||
|
||||
input = raw_input
|
||||
|
||||
def itervalues(dct, **kwargs):
|
||||
return iter(dct.itervalues(**kwargs))
|
||||
|
||||
else:
|
||||
import configparser # noqa
|
||||
import queue # noqa
|
||||
import _thread as thread # noqa
|
||||
|
||||
string_types = (str,)
|
||||
text_type = str
|
||||
|
||||
input = input
|
||||
|
||||
def itervalues(dct, **kwargs):
|
||||
return iter(dct.values(**kwargs))
|
||||
@ -1,12 +1,13 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import ConfigParser as configparser
|
||||
import io
|
||||
import itertools
|
||||
import logging
|
||||
import os.path
|
||||
import re
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.compat import configparser
|
||||
from mopidy.config import keyring
|
||||
from mopidy.config.schemas import * # noqa
|
||||
from mopidy.config.types import * # noqa
|
||||
@ -108,7 +109,7 @@ def _load(files, defaults, overrides):
|
||||
# all in the same way?
|
||||
logger.info('Loading config from builtin defaults')
|
||||
for default in defaults:
|
||||
if isinstance(default, unicode):
|
||||
if isinstance(default, compat.text_type):
|
||||
default = default.encode('utf-8')
|
||||
parser.readfp(io.BytesIO(default))
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
@ -9,6 +9,8 @@ try:
|
||||
except ImportError:
|
||||
dbus = None
|
||||
|
||||
from mopidy import compat
|
||||
|
||||
|
||||
# XXX: Hack to workaround introspection bug caused by gnome-keyring, should be
|
||||
# fixed by version 3.5 per:
|
||||
@ -57,7 +59,7 @@ def fetch():
|
||||
|
||||
result = []
|
||||
secrets = service.GetSecrets(items, session, byte_arrays=True)
|
||||
for item_path, values in secrets.iteritems():
|
||||
for item_path, values in secrets.items():
|
||||
session_path, parameters, value, content_type = values
|
||||
attrs = _item_attributes(bus, item_path)
|
||||
result.append((attrs['section'], attrs['key'], bytes(value)))
|
||||
@ -92,7 +94,7 @@ def set(section, key, value):
|
||||
if not collection:
|
||||
return False
|
||||
|
||||
if isinstance(value, unicode):
|
||||
if isinstance(value, compat.text_type):
|
||||
value = value.encode('utf-8')
|
||||
|
||||
session = service.OpenSession('plain', EMPTY_STRING)[1]
|
||||
@ -161,7 +163,7 @@ def _prompt(bus, path):
|
||||
def _item_attributes(bus, path):
|
||||
item = _interface(bus, path, 'org.freedesktop.DBus.Properties')
|
||||
result = item.Get('org.freedesktop.Secret.Item', 'Attributes')
|
||||
return dict((bytes(k), bytes(v)) for k, v in result.iteritems())
|
||||
return dict((bytes(k), bytes(v)) for k, v in result.items())
|
||||
|
||||
|
||||
def _interface(bus, path, interface):
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
|
||||
|
||||
@ -1,22 +1,23 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import re
|
||||
import socket
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.config import validators
|
||||
from mopidy.utils import path
|
||||
|
||||
|
||||
def decode(value):
|
||||
if isinstance(value, unicode):
|
||||
if isinstance(value, compat.text_type):
|
||||
return value
|
||||
# TODO: only unescape \n \t and \\?
|
||||
return value.decode('string-escape').decode('utf-8')
|
||||
|
||||
|
||||
def encode(value):
|
||||
if not isinstance(value, unicode):
|
||||
if not isinstance(value, compat.text_type):
|
||||
return value
|
||||
for char in ('\\', '\n', '\t'): # TODO: more escapes?
|
||||
value = value.replace(char, char.encode('unicode-escape'))
|
||||
@ -278,7 +279,7 @@ class Path(ConfigValue):
|
||||
return ExpandedPath(value, expanded)
|
||||
|
||||
def serialize(self, value, display=False):
|
||||
if isinstance(value, unicode):
|
||||
if isinstance(value, compat.text_type):
|
||||
raise ValueError('paths should always be bytes')
|
||||
if isinstance(value, ExpandedPath):
|
||||
return value.original
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
# TODO: add validate regexp?
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
# flake8: noqa
|
||||
from .actor import Core
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
import itertools
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import copy
|
||||
import logging
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
import operator
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy import listener
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import urlparse
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import itertools
|
||||
import urlparse
|
||||
@ -53,7 +53,7 @@ class PlaylistsController(object):
|
||||
backend = self.backends.with_playlists[uri_scheme]
|
||||
else:
|
||||
# TODO: this fallback looks suspicious
|
||||
backend = self.backends.with_playlists.values()[0]
|
||||
backend = list(self.backends.with_playlists.values())[0]
|
||||
playlist = backend.playlists.create(name).get()
|
||||
listener.CoreListener.send('playlist_changed', playlist=playlist)
|
||||
return playlist
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
import logging
|
||||
import random
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.core import listener
|
||||
from mopidy.models import TlTrack
|
||||
|
||||
@ -327,16 +328,16 @@ class TracklistController(object):
|
||||
"""
|
||||
criteria = criteria or kwargs
|
||||
matches = self._tl_tracks
|
||||
for (key, values) in criteria.iteritems():
|
||||
for (key, values) in criteria.items():
|
||||
if (not isinstance(values, collections.Iterable)
|
||||
or isinstance(values, basestring)):
|
||||
or isinstance(values, compat.string_types)):
|
||||
# Fail hard if anyone is using the <0.17 calling style
|
||||
raise ValueError('Filter values must be iterable: %r' % values)
|
||||
if key == 'tlid':
|
||||
matches = filter(lambda ct: ct.tlid in values, matches)
|
||||
matches = [ct for ct in matches if ct.tlid in values]
|
||||
else:
|
||||
matches = filter(
|
||||
lambda ct: getattr(ct.track, key) in values, matches)
|
||||
matches = [
|
||||
ct for ct in matches if getattr(ct.track, key) in values]
|
||||
return matches
|
||||
|
||||
def move(self, start, end, to_position):
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
|
||||
class MopidyException(Exception):
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
import logging
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import json
|
||||
import logging
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,10 +1,11 @@
|
||||
from __future__ import print_function, unicode_literals
|
||||
from __future__ import (
|
||||
absolute_import, division, print_function, unicode_literals)
|
||||
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
|
||||
from mopidy import commands, exceptions
|
||||
from mopidy import commands, compat, exceptions
|
||||
from mopidy.audio import scan
|
||||
from mopidy.local import translator
|
||||
from mopidy.utils import path
|
||||
@ -39,7 +40,7 @@ class ClearCommand(commands.Command):
|
||||
library = _get_library(args, config)
|
||||
prompt = '\nAre you sure you want to clear the library? [y/N] '
|
||||
|
||||
if raw_input(prompt).lower() != 'y':
|
||||
if compat.input(prompt).lower() != 'y':
|
||||
print('Clearing library aborted.')
|
||||
return 0
|
||||
|
||||
@ -163,6 +164,6 @@ class _Progress(object):
|
||||
logger.info('Scanned %d of %d files in %ds.',
|
||||
self.count, self.total, duration)
|
||||
else:
|
||||
remainder = duration / self.count * (self.total - self.count)
|
||||
remainder = duration // self.count * (self.total - self.count)
|
||||
logger.info('Scanned %d of %d files in %ds, ~%ds left.',
|
||||
self.count, self.total, duration, remainder)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
from __future__ import absolute_import, absolute_import, unicode_literals
|
||||
|
||||
import collections
|
||||
import gzip
|
||||
@ -11,7 +11,7 @@ import tempfile
|
||||
import time
|
||||
|
||||
import mopidy
|
||||
from mopidy import local, models
|
||||
from mopidy import compat, local, models
|
||||
from mopidy.local import search, storage, translator
|
||||
from mopidy.utils import encoding
|
||||
|
||||
@ -164,7 +164,7 @@ class JsonLibrary(local.Library):
|
||||
return search.search(tracks, query=query, uris=uris)
|
||||
|
||||
def begin(self):
|
||||
return self._tracks.itervalues()
|
||||
return compat.itervalues(self._tracks)
|
||||
|
||||
def add(self, track):
|
||||
self._tracks[track.uri] = track
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, division, unicode_literals
|
||||
|
||||
import glob
|
||||
import logging
|
||||
@ -92,7 +92,7 @@ class LocalPlaylistsProvider(backend.PlaylistsProvider):
|
||||
|
||||
def _write_m3u_extinf(self, file_handle, track):
|
||||
title = track.name.encode('latin-1', 'replace')
|
||||
runtime = track.length / 1000 if track.length else -1
|
||||
runtime = track.length // 1000 if track.length else -1
|
||||
file_handle.write('#EXTINF:' + str(runtime) + ',' + title + '\n')
|
||||
|
||||
def _save_m3u(self, playlist):
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.models import Album, SearchResult
|
||||
|
||||
@ -11,7 +11,7 @@ def find_exact(tracks, query=None, uris=None):
|
||||
|
||||
_validate_query(query)
|
||||
|
||||
for (field, values) in query.iteritems():
|
||||
for (field, values) in query.items():
|
||||
if not hasattr(values, '__iter__'):
|
||||
values = [values]
|
||||
# FIXME this is bound to be slow for large libraries
|
||||
@ -91,7 +91,7 @@ def search(tracks, query=None, uris=None):
|
||||
|
||||
_validate_query(query)
|
||||
|
||||
for (field, values) in query.iteritems():
|
||||
for (field, values) in query.items():
|
||||
if not hasattr(values, '__iter__'):
|
||||
values = [values]
|
||||
# FIXME this is bound to be slow for large libraries
|
||||
@ -165,7 +165,7 @@ def search(tracks, query=None, uris=None):
|
||||
|
||||
|
||||
def _validate_query(query):
|
||||
for (_, values) in query.iteritems():
|
||||
for (_, values) in query.items():
|
||||
if not values:
|
||||
raise LookupError('Missing query')
|
||||
for value in values:
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import os
|
||||
@ -6,6 +6,7 @@ import re
|
||||
import urllib
|
||||
import urlparse
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.models import Track
|
||||
from mopidy.utils.encoding import locale_decode
|
||||
from mopidy.utils.path import path_to_uri, uri_to_path
|
||||
@ -29,14 +30,14 @@ def local_track_uri_to_path(uri, media_dir):
|
||||
|
||||
def path_to_local_track_uri(relpath):
|
||||
"""Convert path releative to media_dir to local track URI."""
|
||||
if isinstance(relpath, unicode):
|
||||
if isinstance(relpath, compat.text_type):
|
||||
relpath = relpath.encode('utf-8')
|
||||
return b'local:track:%s' % urllib.quote(relpath)
|
||||
|
||||
|
||||
def path_to_local_directory_uri(relpath):
|
||||
"""Convert path relative to :confval:`local/media_dir` directory URI."""
|
||||
if isinstance(relpath, unicode):
|
||||
if isinstance(relpath, compat.text_type):
|
||||
relpath = relpath.encode('utf-8')
|
||||
return b'local:directory:%s' % urllib.quote(relpath)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import json
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import re
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.exceptions import MopidyException
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ implement our own MPD server which is compatible with the numerous existing
|
||||
`MPD clients <http://mpd.wikia.com/wiki/Clients>`_.
|
||||
"""
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import inspect
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import warnings
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import functools
|
||||
import itertools
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import warnings
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import pykka
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from mopidy.mpd import exceptions, protocol
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import division, unicode_literals
|
||||
from __future__ import absolute_import, division, unicode_literals
|
||||
|
||||
import datetime
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import re
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import re
|
||||
|
||||
@ -59,13 +59,13 @@ def track_to_mpd_format(track, position=None):
|
||||
if track.album is not None and track.album.artists:
|
||||
artists = artists_to_mpd_format(track.album.artists)
|
||||
result.append(('AlbumArtist', artists))
|
||||
artists = filter(
|
||||
lambda a: a.musicbrainz_id is not None, track.album.artists)
|
||||
artists = [
|
||||
a for a in track.album.artists if a.musicbrainz_id is not None]
|
||||
if artists:
|
||||
result.append(
|
||||
('MUSICBRAINZ_ALBUMARTISTID', artists[0].musicbrainz_id))
|
||||
if track.artists:
|
||||
artists = filter(lambda a: a.musicbrainz_id is not None, track.artists)
|
||||
artists = [a for a in track.artists if a.musicbrainz_id is not None]
|
||||
if artists:
|
||||
result.append(('MUSICBRAINZ_ARTISTID', artists[0].musicbrainz_id))
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import fnmatch
|
||||
import logging
|
||||
|
||||
@ -1 +1 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import functools
|
||||
import os
|
||||
|
||||
@ -1,10 +1,12 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import locale
|
||||
|
||||
from mopidy import compat
|
||||
|
||||
|
||||
def locale_decode(bytestr):
|
||||
try:
|
||||
return unicode(bytestr)
|
||||
return compat.text_type(bytestr)
|
||||
except UnicodeError:
|
||||
return str(bytestr).decode(locale.getpreferredencoding())
|
||||
return bytes(bytestr).decode(locale.getpreferredencoding())
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import re
|
||||
import unicodedata
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import inspect
|
||||
import json
|
||||
@ -6,6 +6,8 @@ import traceback
|
||||
|
||||
import pykka
|
||||
|
||||
from mopidy import compat
|
||||
|
||||
|
||||
class JsonRpcWrapper(object):
|
||||
"""
|
||||
@ -137,13 +139,13 @@ class JsonRpcWrapper(object):
|
||||
except TypeError as error:
|
||||
raise JsonRpcInvalidParamsError(data={
|
||||
'type': error.__class__.__name__,
|
||||
'message': unicode(error),
|
||||
'message': compat.text_type(error),
|
||||
'traceback': traceback.format_exc(),
|
||||
})
|
||||
except Exception as error:
|
||||
raise JsonRpcApplicationError(data={
|
||||
'type': error.__class__.__name__,
|
||||
'message': unicode(error),
|
||||
'message': compat.text_type(error),
|
||||
'traceback': traceback.format_exc(),
|
||||
})
|
||||
except JsonRpcError as error:
|
||||
@ -164,7 +166,7 @@ class JsonRpcWrapper(object):
|
||||
if 'method' not in request:
|
||||
raise JsonRpcInvalidRequestError(
|
||||
data='"method" member must be included')
|
||||
if not isinstance(request['method'], unicode):
|
||||
if not isinstance(request['method'], compat.text_type):
|
||||
raise JsonRpcInvalidRequestError(
|
||||
data='"method" must be a string')
|
||||
|
||||
@ -320,12 +322,12 @@ class JsonRpcInspector(object):
|
||||
available properties and methods.
|
||||
"""
|
||||
methods = {}
|
||||
for mount, obj in self.objects.iteritems():
|
||||
for mount, obj in self.objects.items():
|
||||
if inspect.isroutine(obj):
|
||||
methods[mount] = self._describe_method(obj)
|
||||
else:
|
||||
obj_methods = self._get_methods(obj)
|
||||
for name, description in obj_methods.iteritems():
|
||||
for name, description in obj_methods.items():
|
||||
if mount:
|
||||
name = '%s.%s' % (mount, name)
|
||||
methods[name] = description
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import logging.config
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import errno
|
||||
import logging
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import Queue as queue
|
||||
import logging
|
||||
import os
|
||||
import stat
|
||||
@ -11,6 +10,9 @@ import urlparse
|
||||
|
||||
import glib
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.compat import queue
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@ -64,7 +66,7 @@ def path_to_uri(path):
|
||||
|
||||
Returns a file:// URI as an unicode string.
|
||||
"""
|
||||
if isinstance(path, unicode):
|
||||
if isinstance(path, compat.text_type):
|
||||
path = path.encode('utf-8')
|
||||
path = urllib.quote(path)
|
||||
return urlparse.urlunsplit((b'file', b'', path, b'', b''))
|
||||
@ -81,7 +83,7 @@ def uri_to_path(uri):
|
||||
look up the matching dir or file on your file system because the exact path
|
||||
would be lost by ignoring its encoding.
|
||||
"""
|
||||
if isinstance(uri, unicode):
|
||||
if isinstance(uri, compat.text_type):
|
||||
uri = uri.encode('utf-8')
|
||||
return urllib.unquote(urlparse.urlsplit(uri).path)
|
||||
|
||||
@ -196,7 +198,7 @@ def _find(root, thread_count=10, relative=False, follow=False):
|
||||
|
||||
def find_mtimes(root, follow=False):
|
||||
results, errors = _find(root, relative=False, follow=follow)
|
||||
mtimes = dict((f, int(st.st_mtime)) for f, st in results.iteritems())
|
||||
mtimes = dict((f, int(st.st_mtime)) for f, st in results.items())
|
||||
return mtimes, errors
|
||||
|
||||
|
||||
|
||||
@ -1,20 +1,20 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import signal
|
||||
try:
|
||||
import _thread as thread # Python 3
|
||||
except ImportError:
|
||||
import thread # Python 2
|
||||
import threading
|
||||
|
||||
from pykka import ActorDeadError
|
||||
from pykka.registry import ActorRegistry
|
||||
|
||||
from mopidy.compat import thread
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
SIGNALS = dict(
|
||||
(k, v) for v, k in signal.__dict__.iteritems()
|
||||
(k, v) for v, k in signal.__dict__.items()
|
||||
if v.startswith('SIG') and not v.startswith('SIG_'))
|
||||
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import socket
|
||||
|
||||
2
setup.py
2
setup.py
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import re
|
||||
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
|
||||
from mopidy import compat
|
||||
|
||||
|
||||
def path_to_data_dir(name):
|
||||
if not isinstance(name, bytes):
|
||||
@ -31,4 +33,4 @@ class IsA(object):
|
||||
|
||||
any_int = IsA(int)
|
||||
any_str = IsA(str)
|
||||
any_unicode = IsA(unicode)
|
||||
any_unicode = IsA(compat.text_type)
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import nose
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import threading
|
||||
import unittest
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# encoding: utf-8
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import io
|
||||
import unittest
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import os
|
||||
import unittest
|
||||
|
||||
@ -1 +1 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# encoding: utf-8
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import unittest
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
# encoding: utf-8
|
||||
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import logging
|
||||
import socket
|
||||
@ -8,6 +8,7 @@ import unittest
|
||||
|
||||
import mock
|
||||
|
||||
from mopidy import compat
|
||||
from mopidy.config import types
|
||||
|
||||
# TODO: DecodeTest and EncodeTest
|
||||
@ -48,7 +49,7 @@ class StringTest(unittest.TestCase):
|
||||
def test_deserialize_conversion_success(self):
|
||||
value = types.String()
|
||||
self.assertEqual('foo', value.deserialize(b' foo '))
|
||||
self.assertIsInstance(value.deserialize(b'foo'), unicode)
|
||||
self.assertIsInstance(value.deserialize(b'foo'), compat.text_type)
|
||||
|
||||
def test_deserialize_decodes_utf8(self):
|
||||
value = types.String()
|
||||
@ -119,7 +120,7 @@ class SecretTest(unittest.TestCase):
|
||||
def test_deserialize_decodes_utf8(self):
|
||||
value = types.Secret()
|
||||
result = value.deserialize('æøå'.encode('utf-8'))
|
||||
self.assertIsInstance(result, unicode)
|
||||
self.assertIsInstance(result, compat.text_type)
|
||||
self.assertEqual('æøå', result)
|
||||
|
||||
def test_deserialize_enforces_required(self):
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1 +1 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
from __future__ import unicode_literals
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
import unittest
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user