Author: Antonio Cuni <[email protected]>
Branch: py3k
Changeset: r57741:4193517439a8
Date: 2012-10-02 17:54 +0200
http://bitbucket.org/pypy/pypy/changeset/4193517439a8/
Log: the _csv module now expects unicode to read, not strings
diff --git a/pypy/module/_csv/interp_reader.py
b/pypy/module/_csv/interp_reader.py
--- a/pypy/module/_csv/interp_reader.py
+++ b/pypy/module/_csv/interp_reader.py
@@ -1,4 +1,4 @@
-from pypy.rlib.rstring import StringBuilder
+from pypy.rlib.rstring import UnicodeBuilder
from pypy.interpreter.baseobjspace import Wrappable
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import NoneNotWrapped, unwrap_spec
@@ -78,13 +78,13 @@
break
raise
self.line_num += 1
- line = space.str_w(w_line)
+ line = space.unicode_w(w_line)
for c in line:
- if c == '\0':
+ if c == u'\0':
raise self.error("line contains NULL byte")
if state == START_RECORD:
- if c == '\n' or c == '\r':
+ if c == u'\n' or c == u'\r':
state = EAT_CRNL
continue
# normal character - handle as START_FIELD
@@ -92,9 +92,9 @@
# fall-through to the next case
if state == START_FIELD:
- field_builder = StringBuilder(64)
+ field_builder = UnicodeBuilder(64)
# expecting field
- if c == '\n' or c == '\r':
+ if c == u'\n' or c == u'\r':
# save empty field
self.save_field(field_builder)
state = EAT_CRNL
@@ -105,7 +105,7 @@
elif c == dialect.escapechar:
# possible escaped character
state = ESCAPED_CHAR
- elif c == ' ' and dialect.skipinitialspace:
+ elif c == u' ' and dialect.skipinitialspace:
# ignore space at start of field
pass
elif c == dialect.delimiter:
@@ -124,7 +124,7 @@
elif state == IN_FIELD:
# in unquoted field
- if c == '\n' or c == '\r':
+ if c == u'\n' or c == u'\r':
# end of line
self.save_field(field_builder)
state = EAT_CRNL
@@ -171,7 +171,7 @@
# save field - wait for new field
self.save_field(field_builder)
state = START_FIELD
- elif c == '\n' or c == '\r':
+ elif c == u'\n' or c == u'\r':
# end of line
self.save_field(field_builder)
state = EAT_CRNL
@@ -184,7 +184,7 @@
dialect.delimiter, dialect.quotechar))
elif state == EAT_CRNL:
- if not (c == '\n' or c == '\r'):
+ if not (c == u'\n' or c == u'\r'):
raise self.error("new-line character seen in unquoted "
"field - do you need to open the file "
"in universal-newline mode?")
@@ -193,16 +193,16 @@
self.save_field(field_builder)
break
elif state == ESCAPED_CHAR:
- self.add_char(field_builder, '\n')
+ self.add_char(field_builder, u'\n')
state = IN_FIELD
elif state == IN_QUOTED_FIELD:
pass
elif state == ESCAPE_IN_QUOTED_FIELD:
- self.add_char(field_builder, '\n')
+ self.add_char(field_builder, u'\n')
state = IN_QUOTED_FIELD
elif state == START_FIELD:
# save empty field
- field_builder = StringBuilder(1)
+ field_builder = UnicodeBuilder(1)
self.save_field(field_builder)
break
else:
@@ -249,7 +249,7 @@
dialect = interp_attrproperty_w('dialect', W_Reader),
line_num = interp_attrproperty('line_num', W_Reader),
__iter__ = interp2app(W_Reader.iter_w),
- next = interp2app(W_Reader.next_w),
+ __next__ = interp2app(W_Reader.next_w),
__doc__ = """CSV reader
Reader objects are responsible for reading and parsing tabular data
diff --git a/pypy/module/_csv/test/test_reader.py
b/pypy/module/_csv/test/test_reader.py
--- a/pypy/module/_csv/test/test_reader.py
+++ b/pypy/module/_csv/test/test_reader.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from pypy.conftest import gettestobjspace
@@ -24,6 +25,11 @@
def test_simple_reader(self):
self._read_test(['foo:bar\n'], [['foo', 'bar']], delimiter=':')
+ def test_cannot_read_bytes(self):
+ import _csv
+ reader = _csv.reader([b'foo'])
+ raises(TypeError, "next(reader)")
+
def test_read_oddinputs(self):
self._read_test([], [])
self._read_test([''], [[]])
@@ -88,13 +94,13 @@
import _csv as csv
r = csv.reader(['line,1', 'line,2', 'line,3'])
assert r.line_num == 0
- r.next()
+ next(r)
assert r.line_num == 1
- r.next()
+ next(r)
assert r.line_num == 2
- r.next()
+ next(r)
assert r.line_num == 3
- raises(StopIteration, r.next)
+ raises(StopIteration, "next(r)")
assert r.line_num == 3
def test_dubious_quote(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit