1# -*- coding: utf-8 -*-
2#pylint: disable=deprecated-module
3import csv
4import codecs
5import io
6
7_reader = codecs.getreader('utf-8')
8_writer = codecs.getwriter('utf-8')
9
10
11def csv_reader(stream, **params):
12    assert not isinstance(stream, io.TextIOBase),\
13        "For cross-compatibility purposes, csv_reader takes a bytes stream"
14    return csv.reader(_reader(stream), **params)
15
16
17def csv_writer(stream, **params):
18    assert not isinstance(stream, io.TextIOBase), \
19        "For cross-compatibility purposes, csv_writer takes a bytes stream"
20    return csv.writer(_writer(stream), **params)
21
22
23def to_text(source):
24    """ Generates a text value (an instance of text_type) from an arbitrary
25    source.
26
27    * False and None are converted to empty strings
28    * text is passed through
29    * bytes are decoded as UTF-8
30    * rest is textified via the current version's relevant data model method
31    """
32    if source is None or source is False:
33        return u''
34
35    if isinstance(source, bytes):
36        return source.decode('utf-8')
37
38    return str(source)
39