[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