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

Reply via email to