Supports taking in data and returning data from calls to get_data
and get_namespaced_data
as CSV.
"""Supports taking in data and returning data from calls to `get_data` and `get_namespaced_data` as CSV.""" import csv import sys from io import BytesIO # TODO Document only supported CSV format # - No column headers # - Key is always position 0 # - Attr keys and values alternate in positions 1..n delimiter = ',' def set_delimiter(c): delimiter = c lineterminator = '|' def set_line_terminator(s): lineterminator = s quoting = csv.QUOTE_MINIMAL def set_quoting_none(): quoting = csv.QUOTE_NONE def set_quoting_all(): quoting = csv.QUOTE_ALL def set_quoting_minimal(): quoting = csv.MINIMAL def set_quoting_nonnumeric(): quoting = csv.NONNUMERIC quotechar = '"' def set_quote_char(c): quotechar = c def deserialize(data): """ * `data` - `dict mapping string keys to lists of dicts of string keys and arbitrary values`. Required function for a data format plugin. Converts data in CSV format to the sofine Python data structure for data sets. In particular, data passed to `sofine` on `stdin` will be processed with this call. This data is expected to adhere to this format (assuming the comma is the delimiter): Key,attribute_name_1,attribute_value_1, Key,attribute_name_1, ... which will be translated to: { "Key": [attribute_name_1: attribute_value_1, ...] ... } """ ret = {} schema = [] # Note this hack with lineterminator. The alternative to manually splitting lines is # to put 'data' into a StringIO, because csv.reader needs an iterable reader = csv.reader(data.split(lineterminator), delimiter=delimiter, lineterminator='', quoting=quoting, quotechar=quotechar) for row in reader: if not len(row): continue # 0th elem in CSV row is data row key key = row[0] key.encode('utf-8') attr_row = row[1:] ret[key] = [{attr_row[j].encode('utf-8') : attr_row[j + 1].encode('utf-8')} for j in range(0, len(attr_row) - 1, 2)] return ret def serialize(data): """ * `data` - `dict mapping string keys to lists of dicts of string keys and arbitrary values`. Required function for a data format plugin. Converts data from the sbfine Python data structure for data sets into CSV. In particular, data passed from `sofine` to `stdout` will be processed with this call. This data is expected to adhere to this format (assuming the comma is the delimiter): { "Key": [attribute_name_1: attribute_value_1, ...] ... } which is be translated to: Key,attribute_name_1,attribute_value_1,Key,attribute_name_1, ... """ # Python docs cryptically say the csv Writer should set the 'b' flag on its # File writer "on platforms that support it." Googling finds that to make this work # with streams you should use BytesIO. StringIO also works (at least for ASCII). out_strm = BytesIO() writer = csv.writer(out_strm, delimiter=delimiter, lineterminator='|', quoting=quoting, quotechar=quotechar) # Flatten each key -> [attrs] 'row' in data into a CSV row with # key in the 0th position, and the attr values in an array in fields 1 .. N for key, attrs in data.iteritems(): row = [] row.append(key) for attr in attrs: row.append(attr.keys()[0]) row.append(attr.values()[0]) writer.writerow(row) ret = out_strm.getvalue() out_strm.close() return ret def get_content_type(): """ Required for a data format plugin. Returns the value for the HTTP Content-Type header. """ return 'text/csv'
var delimiter
var lineterminator
var quotechar
var quoting
def deserialize(
data)
data
- dict mapping string keys to lists of dicts of string keys and arbitrary values
.
Required function for a data format plugin. Converts data in CSV format to the sofine Python data
structure for data sets. In particular, data passed to sofine
on stdin
will be processed with this call.
This data is expected to adhere to this format (assuming the comma is the delimiter):
Key,attribute_name_1,attribute_value_1, Key,attribute_name_1, ...
which will be translated to:
{ "Key": [attribute_name_1: attribute_value_1, ...] ... }
def deserialize(data): """ * `data` - `dict mapping string keys to lists of dicts of string keys and arbitrary values`. Required function for a data format plugin. Converts data in CSV format to the sofine Python data structure for data sets. In particular, data passed to `sofine` on `stdin` will be processed with this call. This data is expected to adhere to this format (assuming the comma is the delimiter): Key,attribute_name_1,attribute_value_1, Key,attribute_name_1, ... which will be translated to: { "Key": [attribute_name_1: attribute_value_1, ...] ... } """ ret = {} schema = [] # Note this hack with lineterminator. The alternative to manually splitting lines is # to put 'data' into a StringIO, because csv.reader needs an iterable reader = csv.reader(data.split(lineterminator), delimiter=delimiter, lineterminator='', quoting=quoting, quotechar=quotechar) for row in reader: if not len(row): continue # 0th elem in CSV row is data row key key = row[0] key.encode('utf-8') attr_row = row[1:] ret[key] = [{attr_row[j].encode('utf-8') : attr_row[j + 1].encode('utf-8')} for j in range(0, len(attr_row) - 1, 2)] return ret
def get_content_type(
)
Required for a data format plugin. Returns the value for the HTTP Content-Type header.
def get_content_type(): """ Required for a data format plugin. Returns the value for the HTTP Content-Type header. """ return 'text/csv'
def serialize(
data)
data
- dict mapping string keys to lists of dicts of string keys and arbitrary values
.
Required function for a data format plugin. Converts data from the sbfine Python data
structure for data sets into CSV. In particular, data passed from sofine
to stdout
will be processed with this call.
This data is expected to adhere to this format (assuming the comma is the delimiter):
{
"Key": [attribute_name_1: attribute_value_1, ...]
...
}
which is be translated to:
Key,attribute_name_1,attribute_value_1,Key,attribute_name_1, ...
def serialize(data): """ * `data` - `dict mapping string keys to lists of dicts of string keys and arbitrary values`. Required function for a data format plugin. Converts data from the sbfine Python data structure for data sets into CSV. In particular, data passed from `sofine` to `stdout` will be processed with this call. This data is expected to adhere to this format (assuming the comma is the delimiter): { "Key": [attribute_name_1: attribute_value_1, ...] ... } which is be translated to: Key,attribute_name_1,attribute_value_1,Key,attribute_name_1, ... """ # Python docs cryptically say the csv Writer should set the 'b' flag on its # File writer "on platforms that support it." Googling finds that to make this work # with streams you should use BytesIO. StringIO also works (at least for ASCII). out_strm = BytesIO() writer = csv.writer(out_strm, delimiter=delimiter, lineterminator='|', quoting=quoting, quotechar=quotechar) # Flatten each key -> [attrs] 'row' in data into a CSV row with # key in the 0th position, and the attr values in an array in fields 1 .. N for key, attrs in data.iteritems(): row = [] row.append(key) for attr in attrs: row.append(attr.keys()[0]) row.append(attr.values()[0]) writer.writerow(row) ret = out_strm.getvalue() out_strm.close() return ret
def set_delimiter(
c)
def set_delimiter(c): delimiter = c
def set_line_terminator(
s)
def set_line_terminator(s): lineterminator = s
def set_quote_char(
c)
def set_quote_char(c): quotechar = c
def set_quoting_all(
)
def set_quoting_all(): quoting = csv.QUOTE_ALL
def set_quoting_minimal(
)
def set_quoting_minimal(): quoting = csv.MINIMAL
def set_quoting_none(
)
def set_quoting_none(): quoting = csv.QUOTE_NONE
def set_quoting_nonnumeric(
)
def set_quoting_nonnumeric(): quoting = csv.NONNUMERIC
Documentation generated by
pdoc
0.2.4.
pdoc is in the public domain with the
UNLICENSE.