Merge pull request #117 from IvanMalison/fix_unicode_decode_error
Fix unicode decode error
This commit is contained in:
commit
caa202ccb2
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -58,3 +58,5 @@ docs/_build/
|
|||
test_pylast.yaml
|
||||
lastfm.txt.pkl
|
||||
secrets.sh
|
||||
|
||||
.dir-locals.el
|
4
clonedigger.sh
Executable file
4
clonedigger.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env bash
|
||||
clonedigger pylast
|
||||
grep -E "Clones detected|lines are duplicates" output.html
|
||||
exit 0
|
|
@ -20,7 +20,7 @@
|
|||
#
|
||||
# http://code.google.com/p/pylast/
|
||||
|
||||
__version__ = '1.0.0'
|
||||
__version__ = '1.0.1'
|
||||
__author__ = 'Amr Hassan, hugovk'
|
||||
__copyright__ = "Copyright (C) 2008-2010 Amr Hassan, 2013-2014 hugovk"
|
||||
__license__ = "apache2"
|
||||
|
@ -37,6 +37,8 @@ import collections
|
|||
import warnings
|
||||
import re
|
||||
|
||||
import six
|
||||
|
||||
|
||||
def _deprecation_warning(message):
|
||||
warnings.warn(message, DeprecationWarning)
|
||||
|
@ -1326,9 +1328,9 @@ class _BaseObject(object):
|
|||
|
||||
def __hash__(self):
|
||||
# Convert any ints (or whatever) into strings
|
||||
values = map(str, self._get_params().values())
|
||||
values = map(six.text_type, self._get_params().values())
|
||||
|
||||
return hash(self.network) + hash(str(type(self)) + "".join(
|
||||
return hash(self.network) + hash(six.text_type(type(self)) + "".join(
|
||||
list(self._get_params().keys()) + list(values)
|
||||
).lower())
|
||||
|
||||
|
@ -1910,9 +1912,12 @@ class Artist(_BaseObject, _Taggable):
|
|||
return "pylast.Artist(%s, %s)" % (
|
||||
repr(self.get_name()), repr(self.network))
|
||||
|
||||
def __unicode__(self):
|
||||
return six.text_type(self.get_name())
|
||||
|
||||
@_string_output
|
||||
def __str__(self):
|
||||
return self.get_name()
|
||||
return self.__unicode__()
|
||||
|
||||
def __eq__(self, other):
|
||||
if type(self) is type(other):
|
||||
|
@ -3966,40 +3971,22 @@ def md5(text):
|
|||
|
||||
|
||||
def _unicode(text):
|
||||
if sys.version_info[0] == 3:
|
||||
if type(text) in (bytes, bytearray):
|
||||
return str(text, "utf-8")
|
||||
elif type(text) == str:
|
||||
if isinstance(text, six.binary_type):
|
||||
return six.text_type(text, "utf-8")
|
||||
elif isinstance(text, six.text_type):
|
||||
return text
|
||||
else:
|
||||
return str(text)
|
||||
|
||||
elif sys.version_info[0] == 2:
|
||||
if type(text) in (str,):
|
||||
return unicode(text, "utf-8")
|
||||
elif type(text) == unicode:
|
||||
return text
|
||||
else:
|
||||
return unicode(text)
|
||||
return six.text_type(text)
|
||||
|
||||
|
||||
def _string(text):
|
||||
def _string(string):
|
||||
"""For Python2 routines that can only process str type."""
|
||||
|
||||
if sys.version_info[0] == 3:
|
||||
if type(text) != str:
|
||||
return str(text)
|
||||
else:
|
||||
return text
|
||||
|
||||
elif sys.version_info[0] == 2:
|
||||
if type(text) == str:
|
||||
return text
|
||||
|
||||
if type(text) == int:
|
||||
return str(text)
|
||||
|
||||
return text.encode("utf-8")
|
||||
if isinstance(string, str):
|
||||
return string
|
||||
casted = six.text_type(string)
|
||||
if sys.version_info[0] == 2:
|
||||
casted = casted.encode("utf-8")
|
||||
return casted
|
||||
|
||||
|
||||
def _collect_nodes(limit, sender, method_name, cacheable, params=None):
|
||||
|
|
5
setup.py
5
setup.py
|
@ -6,8 +6,9 @@ from setuptools import setup, find_packages
|
|||
|
||||
setup(
|
||||
name="pylast",
|
||||
version="1.0.0",
|
||||
version="1.0.1",
|
||||
author="Amr Hassan <amr.hassan@gmail.com>",
|
||||
install_requires=['six'],
|
||||
tests_require=['mock', 'pytest', 'coverage', 'pep8', 'pyyaml', 'pyflakes'],
|
||||
description=("A Python interface to Last.fm "
|
||||
"(and other API compatible social networks)"),
|
||||
|
@ -26,7 +27,7 @@ setup(
|
|||
"Programming Language :: Python :: 3.4",
|
||||
],
|
||||
keywords=["Last.fm", "music", "scrobble", "scrobbling"],
|
||||
packages=find_packages(exclude=('tests*')),
|
||||
packages=find_packages(exclude=('tests*',)),
|
||||
license="Apache2"
|
||||
)
|
||||
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import mock
|
||||
import pytest
|
||||
|
||||
import pylast
|
||||
|
||||
|
||||
def mock_network():
|
||||
return mock.Mock(
|
||||
_get_ws_auth=mock.Mock(return_value=("", "", ""))
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('unicode_artist', [u'\xe9lafdasfdsafdsa', u'ééééééé'])
|
||||
def test_get_cache_key(unicode_artist):
|
||||
request = pylast._Request(mock_network(), 'some_method',
|
||||
params={'artist': unicode_artist})
|
||||
request._get_cache_key()
|
29
tests/unicode_test.py
Normal file
29
tests/unicode_test.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import mock
|
||||
import pytest
|
||||
import six
|
||||
|
||||
import pylast
|
||||
|
||||
|
||||
def mock_network():
|
||||
return mock.Mock(
|
||||
_get_ws_auth=mock.Mock(return_value=("", "", ""))
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize('artist', [
|
||||
u'\xe9lafdasfdsafdsa', u'ééééééé',
|
||||
pylast.Artist(u'B\xe9l', mock_network()),
|
||||
'fdasfdsafsaf not unicode',
|
||||
])
|
||||
def test_get_cache_key(artist):
|
||||
request = pylast._Request(mock_network(), 'some_method',
|
||||
params={'artist': artist})
|
||||
request._get_cache_key()
|
||||
|
||||
|
||||
@pytest.mark.parametrize('obj', [pylast.Artist(u'B\xe9l', mock_network())])
|
||||
def test_cast_and_hash(obj):
|
||||
assert type(six.text_type(obj)) is six.text_type
|
||||
assert isinstance(hash(obj), int)
|
3
tox.ini
3
tox.ini
|
@ -8,6 +8,7 @@ deps =
|
|||
pyyaml
|
||||
pytest
|
||||
mock
|
||||
ipdb
|
||||
pytest-cov
|
||||
commands = py.test -v --cov pylast --cov-report term-missing {posargs}
|
||||
|
||||
|
@ -27,4 +28,4 @@ commands =
|
|||
pyflakes tests
|
||||
pep8 pylast
|
||||
pep8 tests
|
||||
clonedigger pylast -o /dev/stdout | grep -E "Clones detected\|lines are duplicates"
|
||||
./clonedigger.sh
|
Loading…
Reference in a new issue