Merge pull request #901 from jodal/feature/python3-compat

Python 3 compatibility
This commit is contained in:
Stein Magnus Jodal 2014-12-07 21:52:47 +01:00
commit 88592ee17b
154 changed files with 264 additions and 213 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, print_function, unicode_literals
import platform
import sys

View File

@ -1,4 +1,4 @@
from __future__ import print_function, unicode_literals
from __future__ import absolute_import, print_function, unicode_literals
import logging
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
# flake8: noqa
from .actor import Audio

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
class PlaybackState(object):

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy import listener

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import copy

View File

@ -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

View File

@ -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
View 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))

View File

@ -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))

View File

@ -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):

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import collections

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
# TODO: add validate regexp?

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
# flake8: noqa
from .actor import Core

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import collections
import itertools

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import copy
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import collections
import operator

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy import listener

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import urlparse

View File

@ -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

View File

@ -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):

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
class MopidyException(Exception):

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import collections
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import json
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -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)

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -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):

View File

@ -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:

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import os

View File

@ -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)

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import json

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import re

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.exceptions import MopidyException

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import warnings

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import functools
import itertools

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import warnings

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import pykka

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
from mopidy.mpd import exceptions, protocol

View File

@ -1,4 +1,4 @@
from __future__ import division, unicode_literals
from __future__ import absolute_import, division, unicode_literals
import datetime

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import re

View File

@ -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))

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import os

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import fnmatch
import logging

View File

@ -1 +1 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import functools
import os

View File

@ -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())

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import re
import unicodedata

View File

@ -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

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import logging.config

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import errno
import logging

View File

@ -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

View File

@ -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_'))

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import os
import subprocess

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import socket

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import re

View File

@ -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)

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import nose

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import threading
import unittest

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1,6 +1,6 @@
# encoding: utf-8
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import io
import unittest

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import os
import unittest

View File

@ -1 +1 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1,6 +1,6 @@
# encoding: utf-8
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import logging
import unittest

View File

@ -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):

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1 +1 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -1,4 +1,4 @@
from __future__ import unicode_literals
from __future__ import absolute_import, unicode_literals
import unittest

View File

@ -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