[Python-checkins] cpython (merge 3.3 -> default): Issue #18829: csv.Dialect() now checks type for delimiter, escapechar and

serhiy.storchaka python-checkins at python.org
Thu Dec 19 15:30:29 CET 2013


http://hg.python.org/cpython/rev/6b17803bfddd
changeset: 88060:6b17803bfddd
parent: 88057:298d98486794
parent: 88059:52d03fbdf67a
user: Serhiy Storchaka <storchaka at gmail.com>
date: Thu Dec 19 16:28:04 2013 +0200
summary:
 Issue #18829: csv.Dialect() now checks type for delimiter, escapechar and
quotechar fields. Original patch by Vajrasky Kok.
files:
 Lib/test/test_csv.py | 44 ++++++++++++++++++++++++++++---
 Misc/NEWS | 3 ++
 Modules/_csv.c | 9 +++++-
 3 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -756,6 +756,7 @@
 lineterminator = '\r\n'
 quoting = csv.QUOTE_NONE
 d = mydialect()
+ self.assertEqual(d.quoting, csv.QUOTE_NONE)
 
 mydialect.quoting = None
 self.assertRaises(csv.Error, mydialect)
@@ -764,12 +765,21 @@
 mydialect.quoting = csv.QUOTE_ALL
 mydialect.quotechar = '"'
 d = mydialect()
+ self.assertEqual(d.quoting, csv.QUOTE_ALL)
+ self.assertEqual(d.quotechar, '"')
+ self.assertTrue(d.doublequote)
 
 mydialect.quotechar = "''"
- self.assertRaises(csv.Error, mydialect)
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"quotechar" must be an 1-character string')
 
 mydialect.quotechar = 4
- self.assertRaises(csv.Error, mydialect)
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"quotechar" must be string, not int')
 
 def test_delimiter(self):
 class mydialect(csv.Dialect):
@@ -780,12 +790,31 @@
 lineterminator = '\r\n'
 quoting = csv.QUOTE_NONE
 d = mydialect()
+ self.assertEqual(d.delimiter, ";")
 
 mydialect.delimiter = ":::"
- self.assertRaises(csv.Error, mydialect)
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"delimiter" must be an 1-character string')
+
+ mydialect.delimiter = ""
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"delimiter" must be an 1-character string')
+
+ mydialect.delimiter = b","
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"delimiter" must be string, not bytes')
 
 mydialect.delimiter = 4
- self.assertRaises(csv.Error, mydialect)
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"delimiter" must be string, not int')
 
 def test_lineterminator(self):
 class mydialect(csv.Dialect):
@@ -796,12 +825,17 @@
 lineterminator = '\r\n'
 quoting = csv.QUOTE_NONE
 d = mydialect()
+ self.assertEqual(d.lineterminator, '\r\n')
 
 mydialect.lineterminator = ":::"
 d = mydialect()
+ self.assertEqual(d.lineterminator, ":::")
 
 mydialect.lineterminator = 4
- self.assertRaises(csv.Error, mydialect)
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"lineterminator" must be a string')
 
 
 class TestSniffer(unittest.TestCase):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -44,6 +44,9 @@
 Library
 -------
 
+- Issue #18829: csv.Dialect() now checks type for delimiter, escapechar and
+ quotechar fields. Original patch by Vajrasky Kok.
+
 - Issue #19855: uuid.getnode() on Unix now looks on the PATH for the
 executables used to find the mac address, with /sbin and /usr/sbin as
 fallbacks.
diff --git a/Modules/_csv.c b/Modules/_csv.c
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -239,6 +239,12 @@
 *target = '0円';
 if (src != Py_None) {
 Py_ssize_t len;
+ if (!PyUnicode_Check(src)) {
+ PyErr_Format(PyExc_TypeError,
+ "\"%s\" must be string, not %.200s", name,
+ src->ob_type->tp_name);
+ return -1;
+ }
 len = PyUnicode_GetLength(src);
 if (len > 1) {
 PyErr_Format(PyExc_TypeError,
@@ -425,7 +431,8 @@
 if (dialect_check_quoting(self->quoting))
 goto err;
 if (self->delimiter == 0) {
- PyErr_SetString(PyExc_TypeError, "delimiter must be set");
+ PyErr_SetString(PyExc_TypeError,
+ "\"delimiter\" must be an 1-character string");
 goto err;
 }
 if (quotechar == Py_None && quoting == NULL)
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /