19
|
1 # -*- coding: utf-8 -*-
|
|
2
|
|
3 """
|
|
4 data models
|
|
5 """
|
|
6
|
21
|
7 from collections import OrderedDict
|
|
8
|
|
9 __all__ = ['Rows', 'Columns']
|
|
10
|
|
11
|
|
12 class ColumnNumberException(Exception):
|
|
13 """
|
|
14 wrong number of columns: {given} given; {expected} expected
|
|
15 """
|
|
16 def __init__(self, given, expected):
|
|
17 self.given = given
|
|
18 self.expected = expected
|
|
19 Exception.__init__(self.__doc__.format(**self.__dict__))
|
|
20
|
|
21
|
|
22 class Rows(object):
|
|
23 """
|
|
24 row-based data
|
|
25 """
|
|
26
|
|
27 array = OrderedDict
|
19
|
28
|
21
|
29 def __init__(self, columns, *rows):
|
|
30 """
|
|
31 columns -- column labels
|
|
32 """
|
|
33 self.column_names = columns
|
|
34 self.rows = []
|
|
35
|
|
36 for row in rows:
|
|
37 self += row
|
|
38
|
|
39 def __iadd__(self, row):
|
|
40 """add a labeled row"""
|
|
41 if len(row) != len(self.columns_names):
|
|
42 raise ColumnNumberException(len(row), len(self.columns_names))
|
|
43 self.rows.append(self.array(zip(self.columns_names, row)))
|
|
44
|
|
45 def __len__(self):
|
|
46 return len(self.rows)
|
|
47
|
|
48 def __getitem__(self, item):
|
|
49 return self.rows[item]
|