[pypy-commit] pypy default: More tests. writerows().

arigo noreply at buildbot.pypy.org
Mon Sep 24 18:10:29 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: 
Changeset: r57504:442076db3e84
Date: 2012-09-24 17:01 +0200
http://bitbucket.org/pypy/pypy/changeset/442076db3e84/

Log:	More tests. writerows().

diff --git a/pypy/module/_csv/interp_writer.py b/pypy/module/_csv/interp_writer.py
--- a/pypy/module/_csv/interp_writer.py
+++ b/pypy/module/_csv/interp_writer.py
@@ -29,6 +29,8 @@
     error._dont_inline_ = True
 
     def writerow(self, w_fields):
+        """Construct and write a CSV record from a sequence of fields.
+        Non-string elements will be converted to string."""
         space = self.space
         fields_w = space.listview(w_fields)
         dialect = self.dialect
@@ -48,7 +50,7 @@
                     space.float_w(w_field)    # is it an int/long/float?
                     quoted = False
                 except OperationError, e:
-                    if e.async(self):
+                    if e.async(space):
                         raise
                     quoted = True
             elif dialect.quoting == QUOTE_ALL:
@@ -114,6 +116,20 @@
         line = rec.build()
         return space.call_function(self.w_filewrite, space.wrap(line))
 
+    def writerows(self, w_seqseq):
+        """Construct and write a series of sequences to a csv file.
+        Non-string elements will be converted to string."""
+        space = self.space
+        w_iter = space.iter(w_seqseq)
+        while True:
+            try:
+                w_seq = space.next(w_iter)
+            except OperationError, e:
+                if e.match(space, space.w_StopIteration):
+                    break
+                raise
+            self.writerow(w_seq)
+
 
 def csv_writer(space, w_fileobj, w_dialect=NoneNotWrapped,
                   w_delimiter        = NoneNotWrapped,
@@ -148,6 +164,7 @@
         __module__ = '_csv',
         dialect = interp_attrproperty_w('dialect', W_Writer),
         writerow = interp2app(W_Writer.writerow),
+        writerows = interp2app(W_Writer.writerows),
         __doc__ = """CSV writer
 
 Writer objects are responsible for generating tabular data
diff --git a/pypy/module/_csv/test/test_writer.py b/pypy/module/_csv/test/test_writer.py
--- a/pypy/module/_csv/test/test_writer.py
+++ b/pypy/module/_csv/test/test_writer.py
@@ -18,7 +18,10 @@
             def _write_test(fields, expect, **kwargs):
                 fileobj = DummyFile()
                 writer = _csv.writer(fileobj, **kwargs)
-                writer.writerow(fields)
+                if len(fields) > 0 and type(fields[0]) is list:
+                    writer.writerows(fields)
+                else:
+                    writer.writerow(fields)
                 result = fileobj.getvalue()
                 expect += writer.dialect.lineterminator
                 assert result == expect, 'result: %r\nexpect: %r' % (
@@ -48,3 +51,40 @@
             def __str__(self):
                 raise IOError
         raises(IOError, self._write_test, [BadItem()], '')
+
+    def test_write_quoting(self):
+        import _csv as csv
+        self._write_test(['a',1,'p,q'], 'a,1,"p,q"')
+        raises(csv.Error, self._write_test,
+                          ['a',1,'p,q'], 'a,1,p,q',
+                          quoting = csv.QUOTE_NONE)
+        self._write_test(['a',1,'p,q'], 'a,1,"p,q"',
+                         quoting = csv.QUOTE_MINIMAL)
+        self._write_test(['a',1,'p,q'], '"a",1,"p,q"',
+                         quoting = csv.QUOTE_NONNUMERIC)
+        self._write_test(['a',1,'p,q'], '"a","1","p,q"',
+                         quoting = csv.QUOTE_ALL)
+        self._write_test(['a\nb',1], '"a\nb","1"',
+                         quoting = csv.QUOTE_ALL)
+
+    def test_write_escape(self):
+        import _csv as csv
+        self._write_test(['a',1,'p,q'], 'a,1,"p,q"',
+                         escapechar='\\')
+        raises(csv.Error, self._write_test,
+                          ['a',1,'p,"q"'], 'a,1,"p,\\"q\\""',
+                          escapechar=None, doublequote=False)
+        self._write_test(['a',1,'p,"q"'], 'a,1,"p,\\"q\\""',
+                         escapechar='\\', doublequote = False)
+        self._write_test(['"'], '""""',
+                         escapechar='\\', quoting = csv.QUOTE_MINIMAL)
+        self._write_test(['"'], '\\"',
+                         escapechar='\\', quoting = csv.QUOTE_MINIMAL,
+                         doublequote = False)
+        self._write_test(['"'], '\\"',
+                         escapechar='\\', quoting = csv.QUOTE_NONE)
+        self._write_test(['a',1,'p,q'], 'a,1,p\\,q',
+                         escapechar='\\', quoting = csv.QUOTE_NONE)
+
+    def test_writerows(self):
+        self._write_test([['a'],['b','c']], 'a\r\nb,c')


More information about the pypy-commit mailing list