The current change made in de68f08d37 breaks cinder and other
projects that were expecting a TypeError, so for now and to keep
those projects operating translate the py3.x exception from binascii
into a type error to prefer consistency with existing code.
Change-Id: I4575ea3dad51be9bb2278eb0bfa31cef54c300d5
Document in which version new types and functions were added using
".. versionadded:: x.y". Document changes using
".. versionchanged:: x.y."
For base64 module, add the versionadded tag in the module top
docstring, not on each type/function.
I used "git blame" + "git tag --contains=SHA1" to find these version,
and then I checked manually each version.
Change-Id: I4a891b18064fe7b857a79c57030ff31f7a0370b4
Writing a code using the base64 module (of the Python standard
library) working on Python 2.7 and 3.4 requires many checks on the
input and/or output type:
* base64.b64encode() only accepts byte string: text must be
explicitly encoded to ASCII
* base64.b64decode() returns bytes: output must be decoded from UTF-8
when text is expected
This change adds two pairs of encode/decode functions:
* encode_as_bytes(), decode_as_bytes(): always return the result as
a byte string
* encode_as_text(), decode_as_text(): always return the result as a
text string
Encode functions accept text: text is encoded to UTF-8 by default,
but the encoding is configurable.
Decode functions accept text: text is decoded from ASCII.
decode_as_text() decodes the result from UTF-8 by default, but again
the encoding is configurable.
The new submodule is called "base64" to be able to replace:
import base64
with:
from oslo_serialization import base64
If the base64 module of the stdlib is needed, it can be imported as a
different name. Example:
import base64 as std_base64
The encoding example:
if isinstance(text, six.text_type):
text = text.encode('utf-8')
text_b64 = base64.b64encode(text)
text_b64 = text_b64.decode('ascii')
can be replaced with:
text_b64 = base64.encode_as_text(text)
The decoding example:
if isinstance(encoded, six.text_type):
encoded = encoded.decode('ascii')
text = base64.b64decode(encoded)
text = text.decode('utf-8')
can be replaced with:
text = base64.decode_as_text(text)
Change-Id: Icf8df9c947bc0c5f4838508b756ed8f53efd9fc4