Start work on getting text handled properly on PY3

This commit is contained in:
Dan O'Reilly 2015-08-15 10:11:28 -04:00
parent 3ff5625231
commit fc80874adf

View File

@ -67,6 +67,29 @@ class Error(Exception):
class ParseError(Error):
"""Thrown in case of ASCII parsing error."""
class TextWriter(object):
def __init__(self, as_utf8):
self._utf8 = as_utf8
if as_utf8:
self._writer = io.BytesIO()
else:
self._writer = io.StringIO()
def write(self, val):
if self._utf8:
if isinstance(val, six.text_type):
val = val.encode('utf-8')
else:
if isinstance(val, bytes):
val = val.decode('utf-8')
return self._writer.write(val)
def close(self):
return self._writer.close()
def getvalue(self):
return self._writer.getvalue()
def MessageToString(message, as_utf8=False, as_one_line=False,
pointy_brackets=False, use_index_order=False,
@ -92,7 +115,7 @@ def MessageToString(message, as_utf8=False, as_one_line=False,
Returns:
A string of the text formatted protocol buffer message.
"""
out = io.BytesIO()
out = TextWriter(as_utf8)
PrintMessage(message, out, as_utf8=as_utf8, as_one_line=as_one_line,
pointy_brackets=pointy_brackets,
use_index_order=use_index_order,
@ -159,11 +182,7 @@ def PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False,
# For groups, use the capitalized name.
out.write(field.message_type.name)
else:
if isinstance(field.name, six.text_type):
name = field.name.encode('utf-8')
else:
name = field.name
out.write(name)
out.write(field.name)
if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE:
# The colon is optional in this case, but our cross-language golden files
@ -226,7 +245,8 @@ def PrintFieldValue(field, value, out, indent=0, as_utf8=False,
out_as_utf8 = False
else:
out_as_utf8 = as_utf8
out.write(text_encoding.CEscape(out_value, out_as_utf8))
out_text = text_encoding.CEscape(out_value, out_as_utf8)
out.write(out_text)
out.write('\"')
elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL:
if value: