Skip to content

Commit 20eeadc

Browse files
committed
Reorder StringIO imports again, add to_utf8 function to ensure we encode csv data properly. Fixes #385
1 parent 4aebe01 commit 20eeadc

File tree

1 file changed

+26
-11
lines changed

1 file changed

+26
-11
lines changed

speedtest.py

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
gzip = None
3737
GZIP_BASE = object
3838

39-
__version__ = '1.0.4'
39+
__version__ = '1.0.5a'
4040

4141

4242
class FakeShutdownEvent(object):
@@ -131,21 +131,25 @@ def isSet():
131131
PARSER_TYPE_STR = 'string'
132132

133133
try:
134-
from io import StringIO, BytesIO, TextIOWrapper, FileIO
134+
from cStringIO import StringIO
135+
BytesIO = None
135136
except ImportError:
136137
try:
137-
from cStringIO import StringIO
138-
BytesIO = None
139-
except ImportError:
140138
from StringIO import StringIO
141139
BytesIO = None
140+
except ImportError:
141+
from io import StringIO, BytesIO
142142

143143
try:
144144
import __builtin__
145145
except ImportError:
146146
import builtins
147+
from io import TextIOWrapper, FileIO
147148

148149
class _Py3Utf8Stdout(TextIOWrapper):
150+
"""UTF-8 encoded wrapper around stdout for py3, to override
151+
ASCII stdout
152+
"""
149153
def __init__(self, **kwargs):
150154
buf = FileIO(sys.stdout.fileno(), 'w')
151155
super(_Py3Utf8Stdout, self).__init__(
@@ -161,12 +165,24 @@ def write(self, s):
161165
_py3_print = getattr(builtins, 'print')
162166
_py3_utf8_stdout = _Py3Utf8Stdout()
163167

168+
def to_utf8(v):
169+
"""No-op encode to utf-8 for py3"""
170+
return v
171+
164172
def print_(*args, **kwargs):
173+
"""Wrapper function for py3 to print, with a utf-8 encoded stdout"""
165174
kwargs['file'] = _py3_utf8_stdout
166175
_py3_print(*args, **kwargs)
167176
else:
168177
del __builtin__
169178

179+
def to_utf8(v):
180+
"""Encode value to utf-8 if possible for py2"""
181+
try:
182+
return v.encode('utf8', 'strict')
183+
except AttributeError:
184+
return v
185+
170186
def print_(*args, **kwargs):
171187
"""The new-style print function for Python 2.4 and 2.5.
172188
@@ -700,10 +716,11 @@ def csv(self, delimiter=','):
700716
data = self.dict()
701717
out = StringIO()
702718
writer = csv.writer(out, delimiter=delimiter, lineterminator='')
703-
writer.writerow([data['server']['id'], data['server']['sponsor'],
704-
data['server']['name'], data['timestamp'],
705-
data['server']['d'], data['ping'], data['download'],
706-
data['upload']])
719+
row = [data['server']['id'], data['server']['sponsor'],
720+
data['server']['name'], data['timestamp'],
721+
data['server']['d'], data['ping'], data['download'],
722+
data['upload']]
723+
writer.writerow([to_utf8(v) for v in row])
707724
return out.getvalue()
708725

709726
def json(self, pretty=False):
@@ -1473,5 +1490,3 @@ def main():
14731490

14741491
if __name__ == '__main__':
14751492
main()
1476-
1477-
# vim:ts=4:sw=4:expandtab

0 commit comments

Comments
 (0)