launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #07046
[Merge] lp:~cjwatson/launchpad/remove-services-unicode-csv into lp:launchpad
Colin Watson has proposed merging lp:~cjwatson/launchpad/remove-services-unicode-csv into lp:launchpad.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/remove-services-unicode-csv/+merge/101315
lp.services.unicode_csv was introduced in r4551 (as canonical.launchpad.utilities.unicode_csv) to support entitlements. However, the entitlements code was removed in r14793, and there are no other users of this class in Launchpad. Therefore, it should be removed.
--
https://code.launchpad.net/~cjwatson/launchpad/remove-services-unicode-csv/+merge/101315
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~cjwatson/launchpad/remove-services-unicode-csv into lp:launchpad.
=== removed file 'lib/lp/services/doc/unicode_csv.txt'
--- lib/lp/services/doc/unicode_csv.txt 2011-12-19 15:07:12 +0000
+++ lib/lp/services/doc/unicode_csv.txt 1970-01-01 00:00:00 +0000
@@ -1,118 +0,0 @@
-= Unicode CSV =
-
-The Python library for supporting comma-separated value (CSV) files
-does not support unicode. In the examples section (9.1.5) of the
-Python Libray documentation for version 2.5[1] they provide the code for
-a UnicodeReader and UnicodeWriter.
-
-In order to support direct reading of unicode into dictionaries, the
-standard DictReader and DictWriter have been extended to be
-UnicodeDictReader and UnicodeDictWriter. These two classes are
-identical to their base classes except for they utilize the
-UnicodeReader and UnicodeWriter as their underlying workers.
-
-[1] http://docs.python.org/lib/csv-examples.html
-
-
-== UnicodeCSVReader and UnicodeCSVWriter ==
-
- >>> from cStringIO import StringIO
- >>> from tempfile import mkstemp
- >>> from lp.services.unicode_csv import (
- ... UnicodeCSVReader, UnicodeCSVWriter)
-
-Create a test string with some non-ASCII content representing a row of
-CSV data.
-
- >>> test_data = ["100", "A-101", u'La Pe\xf1a']
- >>> test_string = ','.join(test_data)
- >>> fd, fname = mkstemp()
-
-The data cannot be written using the standard csv.writer class as it
-raises a UnicodeEncodeError.
-
- >>> import csv
- >>> temp_file = open(fname, "wb")
- >>> writer = csv.writer(temp_file)
- >>> writer.writerow(test_data)
- Traceback (most recent call last):
- ...
- UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1'...
-
-Using the UnicodeWriter, write the single row to the temporary file.
-
- >>> temp_file = open(fname, "wb")
- >>> writer = UnicodeCSVWriter(temp_file, encoding="utf-8")
- >>> writer.writerow(test_data)
- >>> temp_file.close()
-
-The data in the file has been converted to UTF-8. If the file is read
-in and compared to the original string they will not match due to the
-encoding difference -- in fact, you should not compare them directly, and
-trying to convert the data read into unicode will raise an error.
-
- >>> file_data = open(fname, "rb").readline()
- >>> file_data == test_string
- Traceback (most recent call last):
- ...
- UnicodeWarning: Unicode equal comparison failed to convert...
- >>> unicode(file_data) == test_string
- Traceback (most recent call last):
- ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3...
-
-The data can be read back using the UnicodeCSVReader.
-
- >>> temp_file = open(fname, "rb")
- >>> reader = UnicodeCSVReader(temp_file, encoding="utf-8")
- >>> file_data = reader.next()
- >>> len(file_data)
- 3
-
- >>> for orig, stored in zip(test_data, file_data):
- ... orig == stored
- True
- True
- True
-
-== UnicodeDictReader and UnicodeDictWriter ==
-
-The dictionary-based versions of the unicode reader and writer work
-exactly like the standard versions, they just take a dictionary as
-input and present a dictionary as output as a convenience.
-
- >>> from lp.services.unicode_csv import (
- ... UnicodeDictReader, UnicodeDictWriter)
-
-Construct a dict using the same data as before.
-
- >>> test_dict = dict(
- ... id="100",
- ... ext_id="A-101",
- ... name=u'La Pe\xf1a')
- >>> fieldnames = test_dict.keys()
- >>> temp_file = open(fname, "wb")
- >>> writer = UnicodeDictWriter(
- ... temp_file, fieldnames=fieldnames, encoding="utf-8")
- >>> writer.writerow(test_dict)
- >>> temp_file.close()
-
-Read the dictionary back in using the UnicodeDictReader.
-
- >>> temp_file = open(fname, "rb")
- >>> reader = UnicodeDictReader(
- ... temp_file, fieldnames=fieldnames, encoding="utf-8")
- >>> read_dict = reader.next()
- >>> len(read_dict)
- 3
-
- >>> for key in fieldnames:
- ... test_dict[key] == read_dict[key]
- True
- True
- True
-
- >>> temp_file.close()
- >>> import os
- >>> os.unlink(fname)
-
=== removed file 'lib/lp/services/unicode_csv.py'
--- lib/lp/services/unicode_csv.py 2011-12-19 15:07:12 +0000
+++ lib/lp/services/unicode_csv.py 1970-01-01 00:00:00 +0000
@@ -1,114 +0,0 @@
-# Copyright 2009 Canonical Ltd. This software is licensed under the
-# GNU Affero General Public License version 3 (see the file LICENSE).
-
-"""Unicode support for CSV files.
-
-Adapted from the Python documentation:
-http://docs.python.org/lib/csv-examples.html
-
-Modified to work for Python 2.4.
-"""
-
-__metaclass__ = type
-__all__ = ['UnicodeReader',
- 'UnicodeWriter',
- 'UnicodeDictReader',
- 'UnicodeDictWriter']
-
-
-import codecs
-import cStringIO
-import csv
-
-
-class UTF8Recoder:
- """Iterator that reads a stream and re-encodes to UTF-8.
-
- A stream of the given encoding is read and then re-encoded to UTF-8
- before being returned.
- """
-
- def __init__(self, f, encoding):
- self.reader = codecs.getreader(encoding)(f)
-
- def __iter__(self):
- return self
-
- def next(self):
- return self.reader.next().encode("utf-8")
-
-
-class UnicodeCSVReader:
- """A CSV reader that reads encoded files and yields unicode."""
-
- class DelegateLineNumAccessDescriptor:
- """The Python 2.5 DictReader expects its reader to support access to a
- line_num attribute, therefore to keep UnicodeCSVReader capable of being
- used within a DictReader we provide a line_num attribute which
- delegates to the real reader."""
-
- def __get__(self, obj, type):
- return obj.reader.line_num
-
- line_num = DelegateLineNumAccessDescriptor()
-
- def __init__(self, file_, dialect=csv.excel, encoding="utf-8", **kwds):
- file_ = UTF8Recoder(file_, encoding)
- self.reader = csv.reader(file_, dialect=dialect, **kwds)
-
- def next(self):
- row = self.reader.next()
- return [unicode(element, "utf-8") for element in row]
-
- def __iter__(self):
- return self
-
-
-class UnicodeCSVWriter:
- """A CSV writer that encodes unicode and writes to the file."""
-
- def __init__(self, file_, dialect=csv.excel, encoding="utf-8", **kwds):
- # Redirect output to a queue
- self.queue = cStringIO.StringIO()
- self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
- self.stream = file_
- self.encoder = codecs.getencoder(encoding)
-
- def writerow(self, row):
- self.writer.writerow([s.encode("utf-8") for s in row])
- # Fetch UTF-8 output from the queue ...
- data = self.queue.getvalue()
- data = data.decode("utf-8")
- # ... and re-encode it into the target encoding
- (data,len_encoded) = self.encoder(data)
- # write to the target stream
- self.stream.write(data)
- # empty queue
- self.queue.truncate(0)
-
- def writerows(self, rows):
- for row in rows:
- self.writerow(row)
-
-
-class UnicodeDictReader(csv.DictReader):
- """A CSV dict reader that reads encoded files and yields unicode."""
-
- def __init__(self, file_, fieldnames=None, restkey=None, restval=None,
- dialect="excel", encoding="utf-8", *args, **kwds):
- csv.DictReader.__init__(self, file_, fieldnames, restkey, restval,
- dialect, *args, **kwds)
- # overwrite the reader with a UnicodeCSVReader
- self.reader = UnicodeCSVReader(file_, dialect, encoding, *args, **kwds)
-
-
-class UnicodeDictWriter(csv.DictWriter):
- """A CSV dict writer that encodes unicode and writes to the file."""
-
- def __init__(self, file_, fieldnames, restval="", extrasaction="raise",
- dialect="excel", encoding="utf-8",
- *args, **kwds):
- csv.DictWriter.__init__(self, file_, fieldnames, restval,
- extrasaction, dialect, *args, **kwds)
- # overwrite the writer with a UnicodeCSVWriter
- self.writer = UnicodeCSVWriter(file_, dialect, encoding, *args, **kwds)