def test_02(self): """ Ok scenario. """ sheet = Sheet() self.assertEqual(sheet.captions, []) self.assertEqual(len(sheet), 0) self.assertEqual(sheet.rows, []) sheet.add_column(u'a') self.assertEqual(sheet.captions, [u'a']) self.assertEqual(sheet.captions_index, {u'a': 0}) sheet.add_columns([u'b', u'c']) self.assertEqual(sheet.captions, [u'a', u'b', u'c']) self.assertEqual(sheet.captions_index, {u'a': 0, u'b': 1, u'c': 2}) sheet.append_dict({u'a': 0, u'b': 1, u'c': 2}) self.assertEqual(sheet.rows[0].fields, [0, 1, 2]) sheet.append_iterable([2, 1, 3]) self.assertEqual(sheet.rows[1].fields, [2, 1, 3]) sheet.append(range(3)) sheet.append({u'a': 'ddd', u'b': 'lll', u'c': (1, 2, 3)})
def test_05(self): file = os.path.join(os.path.dirname(__file__), 'files', 'sheet.csv') reader = CSVReader() sheet = Sheet() sheet.add_column(u'Name') self.assertEqual(len(sheet), 0) self.assertEqual(sheet.captions, [u'Name']) reader(sheet, file.decode('utf-8'), create_columns=False) self.assertEqual(len(sheet), 2) self.assertEqual( sheet.captions, [u'Name']) self.assertEqual( [list(row) for row in sheet], [[u'Foo Bar'], [u'Fooer Barer']])
class CSVWriterTest(unittest.TestCase): """ Tests for :py:class:`pysheets.writers.csv.CSVWriter`. """ def setUp(self): self.sheet = Sheet( captions=[u'Number', u'Square', u'Cube'], rows=[(i, i * i, i * i * i) for i in range(5)]) self.file = StringIO() def test_01(self): writer = CSVWriter() writer(self.sheet, self.file) self.assertEqual( self.file.getvalue(), """\ "Number";"Square";"Cube" "0";"0";"0" "1";"1";"1" "2";"4";"8" "3";"9";"27" "4";"16";"64" """ ) def test_02(self): writer = CSVWriter(delimiter='&', quotechar='`') writer(self.sheet, self.file) self.assertEqual( self.file.getvalue(), """\ `Number`&`Square`&`Cube` `0`&`0`&`0` `1`&`1`&`1` `2`&`4`&`8` `3`&`9`&`27` `4`&`16`&`64` """ ) def test_03(self): self.sheet.add_column('Today', [datetime.date(2011, 8, 30)] * 5) self.sheet.add_column( 'Now', [datetime.datetime(2011, 8, 30, 12, 58, 53)] * 5) writer = CSVWriter() writer(self.sheet, self.file) self.assertEqual( self.file.getvalue(), """\ "Number";"Square";"Cube";"Today";"Now" "0";"0";"0";"2011-08-30";"2011-08-30 12:58:53" "1";"1";"1";"2011-08-30";"2011-08-30 12:58:53" "2";"4";"8";"2011-08-30";"2011-08-30 12:58:53" "3";"9";"27";"2011-08-30";"2011-08-30 12:58:53" "4";"16";"64";"2011-08-30";"2011-08-30 12:58:53" """ ) def test_04(self): writer = CSVWriter() file_descriptor, file_path = tempfile.mkstemp(suffix='.csv') file_path = file_path.decode('utf-8') writer(self.sheet, file_path) with open(file_path, 'rb') as fp: contents = fp.read() self.assertEqual( contents, """\ "Number";"Square";"Cube" "0";"0";"0" "1";"1";"1" "2";"4";"8" "3";"9";"27" "4";"16";"64" """ )
def test_01(self): """ Ok scenario. """ sheet = Sheet( captions=[u'a', u'b', u'c'], rows=[ {u'a': 4, u'b': 5, u'c': 6}, [4, 2, 3], [2, 4, 5], {u'c': u'haha', u'a': u'caca', u'b': u'dada'}, [1, 7, 5], [3, 2, 5], ]) self.assertEqual(len(sheet), 6) self.assertEqual(sheet.captions, [u'a', u'b', u'c']) self.assertEqual(list(sheet), sheet.rows) self.assertEqual(list(sheet[4]), [1, 7, 5]) self.assertEqual(list(sheet[-2]), [1, 7, 5]) self.assertEqual( [ u' '.join(unicode(field) for field in row) for row in sheet[1::2]], [u'4 2 3', u'caca dada haha', u'3 2 5']) self.assertEqual( [ u' '.join(unicode(field) for field in row) for row in sheet.filter(func=lambda x: x[u'c'] == 5)], [u'2 4 5', u'1 7 5', u'3 2 5']) self.assertEqual( list(sheet.get(u'c', u'a')), [[6, 4], [3, 4], [5, 2], [u'haha', u'caca'], [5, 1], [5, 3]] ) sheet.add_column('d', [1, 2, 3, 4, 5, 6]) column = sheet.get(u'd') self.assertEqual(column.index, 3) self.assertEqual(list(column), [1, 2, 3, 4, 5, 6]) self.assertEqual(list(sheet[3]), [u'caca', u'dada', u'haha', 4]) sheet[3] = {u'a': 1, u'b': 2, u'c': 3, u'd': 4} self.assertEqual(list(sheet[3]), [1, 2, 3, 4]) def compare(rows): self.assertEqual( [ u' '.join(unicode(field) for field in row) for row in sheet], rows,) del sheet[3] compare([ u'4 5 6 1', u'4 2 3 2', u'2 4 5 3', u'1 7 5 5', u'3 2 5 6'],) sheet.sort() compare([ u'1 7 5 5', u'2 4 5 3', u'3 2 5 6', u'4 2 3 2', u'4 5 6 1']) sheet.sort(columns=[u'c', u'a']) compare([ u'4 2 3 2', u'1 7 5 5', u'2 4 5 3', u'3 2 5 6', u'4 5 6 1']) sheet.sort( columns=[u'd', u'b'], cmp=lambda x, y: (x[u'b'] + x[u'd']) - (y[u'b'] + y[u'd'])) compare([ u'4 2 3 2', u'4 5 6 1', u'2 4 5 3', u'3 2 5 6', u'1 7 5 5']) sheet.sort( columns=[u'd', u'b'], key=lambda x: x[u'b'] + x[u'c']) compare([ u'4 2 3 2', u'3 2 5 6', u'2 4 5 3', u'4 5 6 1', u'1 7 5 5']) sheet.sort( columns=[u'd', u'b'], key=lambda x: x[u'b'] + x[u'c'], reverse=True) compare([ u'1 7 5 5', u'4 5 6 1', u'2 4 5 3', u'3 2 5 6', u'4 2 3 2']) sheet.sort([u'd']) sheet.remove(u'b') compare([u'4 6 1', u'4 3 2', u'2 5 3', u'1 5 5', u'3 5 6'],) sheet.remove(u'd') sheet.remove(u'a') compare([u'6', u'3', u'5', u'5', u'5']) sheet.remove(u'c') self.assertEqual(sheet.captions, []) self.assertEqual(len(sheet), 0)
def dump_query_to_sheet( queryset, sheet=None, fields=None, exclude=None, join_rules=None, merge_rules=None): """ Dumps query to sheet. If ``sheet`` is None, then creates one. :param fields: what fields from object to include, if None then all. :param exclude: what fields from object to exclude, if None then none. :param join_rules: what relationships to join_rules by field. :param merge_rules: what relationships to merge_rules into sheet. (``get`` method must return an item or raise DoesNotExist error). :returns: sheet object. """ if sheet is None: sheet = Sheet() if len(queryset) < 1: return sheet obj = queryset[0] if fields is None: fields = collect_fields(obj, exclude) def modifier(sheet, row): """ Changes fields to Unicode strings. """ new_row = collections.defaultdict(unicode) for field_name, (obj, field) in row.items(): if obj is not None: display_attr = 'get_{0}_display'.format(field.name) if hasattr(obj, display_attr): new_row[field_name] = getattr(obj, display_attr)() else: value = getattr(obj, field.name) if value is None: new_row[field_name] = u'' else: new_row[field_name] = value else: new_row[field_name] = field return new_row sheet.add_insert_validator(modifier) sheet.add_columns([field.verbose_name for field in fields]) mergable = {} joinable = {} merge_rules = merge_rules or () join_rules = join_rules or () for related_obj in obj._meta.get_all_related_objects(): if related_obj.name in merge_rules: model = related_obj.model merge_fields = collect_fields(model, ('id',)) mergable[related_obj.name] = merge_fields, model sheet.add_columns([ field.verbose_name for field in merge_fields ]) for field_name, model_name, kwargs in join_rules: if model_name == related_obj.name: model = related_obj.model field = model._meta.get_field(field_name) joinable[related_obj.name.split(':')[1]] = field, kwargs sheet.add_column(field.verbose_name) break for obj in queryset: row = dict([(field.verbose_name, (obj, field)) for field in fields]) for full_name, (merge_fields, model) in mergable.items(): name = full_name.split(':')[1] try: related_obj = getattr(obj, name) for field in merge_fields: row[field.verbose_name] = related_obj, field except model.DoesNotExist: pass for name, (field, (filter_kwargs, exclude_kwargs)) in ( joinable.items()): query = getattr(obj, '{0}_set'.format(name)).all() row[field.verbose_name] = None, join( query.filter(**filter_kwargs).exclude(**exclude_kwargs), field.name) sheet.append_dict(row) return sheet
class ODFSheetReaderTest01(unittest.TestCase): """ Tests for :py:class:`pysheets.readers.ods.ODFSheetReader`. Testing reading ODF file, which has only one table. """ def assertSheet(self, sheet): self.assertEqual(len(sheet), 2) self.assertEqual( sheet.captions, [u'Name', u'E-Mail', u'Phone numbers']) self.assertEqual( [list(row) for row in sheet], [ [ u'Foo Bar', u'*****@*****.**', u'+37060000000;+37061111111'], [ u'Fooer Barer', u'*****@*****.**', u'+37062222222']]) def setUp(self): self.file = os.path.join( os.path.dirname(__file__), 'files', 'sheet.ods' ).decode('utf-8') self.reader = ODFSheetReader() self.sheet = Sheet() self.assertEqual(len(self.sheet), 0) self.assertEqual(self.sheet.captions, []) def tearDown(self): self.file = None self.reader = None self.sheet = None def test_01(self): self.reader(self.sheet, self.file) self.assertSheet(self.sheet) def test_02(self): self.reader(self.sheet, self.file, sheet_name=u'Sheet1') self.assertSheet(self.sheet) def test_03(self): self.assertRaises( ValueError, self.reader, self.sheet, self.file, sheet_name=u'Sheet2') def test_04(self): self.assertRaises( IntegrityError, self.reader, self.sheet, self.file, create_columns=False) def test_05(self): self.sheet.add_column(u'Name') self.reader(self.sheet, self.file, create_columns=False) self.assertEqual( [list(row) for row in self.sheet], [[u'Foo Bar'], [u'Fooer Barer']])