# -*- coding: utf-8 -*- """A delimited data output adapter (e.g. CSV, TSV).""" from __future__ import unicode_literals import contextlib from cli_helpers.compat import csv, StringIO from cli_helpers.utils import filter_dict_by_key from .preprocessors import bytes_to_string, override_missing_value supported_formats = ('csv', 'csv-tab') preprocessors = (override_missing_value, bytes_to_string) class linewriter(object): def __init__(self): self.reset() def reset(self): self.line = None def write(self, d): self.line = d def adapter(data, headers, table_format='csv', **kwargs): """Wrap the formatting inside a function for TabularOutputFormatter.""" keys = ('dialect', 'delimiter', 'doublequote', 'escapechar', 'quotechar', 'quoting', 'skipinitialspace', 'strict') if table_format == 'csv': delimiter = ',' elif table_format == 'csv-tab': delimiter = '\t' else: raise ValueError('Invalid table_format specified.') ckwargs = {'delimiter': delimiter, 'lineterminator': ''} ckwargs.update(filter_dict_by_key(kwargs, keys)) l = linewriter() writer = csv.writer(l, **ckwargs) writer.writerow(headers) yield l.line for row in data: l.reset() writer.writerow(row) yield l.line