# $SnapHashLicense:
#
# SnapLogic - Open source data services
#
# Copyright (C) 2008, SnapLogic, Inc. All rights reserved.
#
# See http://www.snaplogic.org for more information about
# the SnapLogic project.
#
# This program is free software, distributed under the terms of
# the GNU General Public License Version 2. See the LEGAL file
# at the top of the source tree.
#
# "SnapLogic" is a trademark of SnapLogic, Inc.
#
#
# $
#$Id: csv_rp.py 3401 2008-06-20 01:27:02Z grisha $
from StringIO import StringIO
import codecs
import csv
from snaplogic.rp import _RPReader,_RPWriter,utils
from snaplogic.common.snap_exceptions import *
"""
RP for Comma-Separated Values (CSV) as described in
RFC 4180 (http://www.rfc-editor.org/rfc/rfc4180.txt)
"""
CONTENT_TYPE = 'text/csv'
class Writer(_RPWriter):
"""
Writes out Python objects as Comma-Separated Values, quoting
all fields as per RFC 4180.
"""
def __init__(self, stream, version=None, human_request=False, options=False):
"""
Initializes this writer. See L{_RPWriter}.
@param options: May include 'encoding' key. If included, will attempt to
read using the supplied encoding. Otherwise, UTF-8 will be used.
@type options: dict
"""
super(Writer, self).__init__(stream)
self._encoding = None
if options:
if options.has_key('encoding'):
self._encoding = options['encoding']
if not self._encoding:
self._encoding = 'utf-8'
self._writer = utils.UnicodeWriter(self.stream, encoding=self._encoding)
def initialize(self, header = ""):
"""Prepare the underlying stream for sending the data."""
pass
def write(self, raw_record):
"""
Write a Snap Record to the underlying stream.
"""
return self._writer.writerow(raw_record)
def end(self, footer=""):
pass
class Reader(_RPReader):
"""
Reads a tab separated stream.
"""
def __init__(self, stream, version=None, options=None):
"""
Initializes this reader. See L{_RPReader}.
@param options: May include 'encoding' key. If included, will attempt to
read using the supplied encoding. Otherwise, UTF-8 will be used.
@type options: dict
"""
super(Reader, self).__init__(stream)
self._encoding = None
if options:
if options.has_key('encoding'):
self._encoding = options['encoding']
if not self._encoding:
self._encoding = 'utf-8'
self._reader = utils.UnicodeReader(self.stream, encoding=self._encoding)
@classmethod
def supports_non_blocking_read(cls):
"""
Returns False (there is no End-of-Stream marker supported by CSV standard)
"""
return False
def next(self):
return self._reader.next()
|