diff --git a/numcodecs/compat.py b/numcodecs/compat.py index 4fdde180..3ca6bacc 100644 --- a/numcodecs/compat.py +++ b/numcodecs/compat.py @@ -2,6 +2,7 @@ # flake8: noqa from __future__ import absolute_import, print_function, division import sys +import codecs import array @@ -26,11 +27,11 @@ from functools import reduce -def ensure_text(l, encoding='utf-8'): - if isinstance(l, text_type): - return l - else: # pragma: py3 no cover - return text_type(l, encoding=encoding) +def ensure_text(s, encoding='utf-8'): + if not isinstance(s, text_type): + s = ensure_contiguous_ndarray(s) + s = codecs.decode(s, 'ascii') + return s def ensure_ndarray(buf): diff --git a/numcodecs/tests/test_compat.py b/numcodecs/tests/test_compat.py index ed88f171..c39be828 100644 --- a/numcodecs/tests/test_compat.py +++ b/numcodecs/tests/test_compat.py @@ -8,7 +8,19 @@ import pytest -from numcodecs.compat import ensure_bytes, PY2, ensure_contiguous_ndarray +from numcodecs.compat import ensure_text, ensure_bytes, PY2, ensure_contiguous_ndarray, text_type + + +def test_ensure_text(): + bufs = [ + b'adsdasdas', + u'adsdasdas', + np.asarray(memoryview(b'adsdasdas')), + array.array('B', b'qwertyuiqwertyui') + ] + for buf in bufs: + b = ensure_text(buf) + assert isinstance(b, text_type) def test_ensure_bytes():