annotate resfinder/cge/output/table.py @ 0:55051a9bc58d draft default tip

Uploaded
author dcouvin
date Mon, 10 Jan 2022 20:06:07 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
1 #!/usr/bin/env python3
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
2 from .orderedset import OrderedSet
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
3 from .exceptions import DuplicateKeyError
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
4 from .exceptions import LockedObjectError
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
5
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
6
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
7 class TableResults(dict):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
8 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
9 The hit table is created empty.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
10 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
11 def __init__(self, software, version, run_date, run_cmd, id):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
12 self.software = software
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
13 self.version = version
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
14 self.run_date = run_date
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
15 self.run_cmd = run_cmd
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
16 self.id = id
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
17
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
18 self.long = {}
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
19 self.medium = {}
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
20 self.short = {}
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
21 self.databases = {}
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
22
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
23 def add_database(self, id, version):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
24 self.databases[id] = version
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
25
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
26 def add_table(self, table_name, copy=False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
27 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
28 TODO: Implement copy argument
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
29 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
30 if(isinstance(table_name, Table)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
31 name = table_name.name
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
32 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
33 name = table_name
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
34
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
35 if(self.long.get(name, False)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
36 raise DuplicateKeyError("All table names need to be unique. An "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
37 "attempt was made to add a table with a "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
38 "name that already exists. The name is:{}."
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
39 .format(name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
40
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
41 if(isinstance(table_name, Table)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
42 if(copy):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
43 raise NotImplementedError()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
44 # self.long[name] = copy.deepcopy(table_name)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
45 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
46 self.long[name] = table_name
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
47 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
48 self.long[name] = Table(name)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
49
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
50 def as_txt(self, type, header=True, sep="\t", sort=True, pre_name=""):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
51 if(type == "long"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
52 tr = self.long
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
53 elif(type == "medium"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
54 tr = self.medium
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
55 elif(type == "short"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
56 tr = self.short
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
57 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
58 raise ValueError("as_text method in TableResults class must be "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
59 "called with either 'long', 'medium', or "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
60 "'short'. It was called with {}".format(type))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
61
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
62 out_str = ""
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
63
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
64 for table_name in tr:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
65 table_str = tr[table_name].as_txt(header=header, sep=sep, sort=sort)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
66 out_str += ("{pre}{name}\n{table}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
67 .format(pre=pre_name, name=table_name, table=table_str))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
68
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
69 return out_str
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
70
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
71
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
72 def merge(self, tr2, auto_row_header=False, copy=False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
73 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
74 Merges another table result object into the calling table results
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
75 instance.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
76
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
77 Table objects with identical names will be merged, as will headers
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
78 within merged tables.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
79
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
80 The other table is copied with copy.deepcopy so that changes to the
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
81 merged tables or changes to the other table does not affect each
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
82 other.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
83
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
84 IMPORTANT: Currently ONLY merges the tables stored in 'self.long'
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
85 IMPORTANT: Table merge function does not copy the table that gets
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
86 merged. Thus, a change in the table that gets merged
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
87 will also occur in the merged table.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
88 TODO: Implement the copy argument to create a deepcopy of the
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
89 merged table instead of just referencing it.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
90 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
91 if(copy is True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
92 raise NotImplementedError()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
93
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
94 for table_name in tr2.long:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
95 other_tbl = tr2.long[table_name]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
96
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
97 if(table_name not in self.long):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
98 self.add_table(table_name)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
99 self.long[table_name] = other_tbl
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
100 continue
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
101
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
102 call_tbl = self.long[table_name]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
103
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
104 for row_header in other_tbl:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
105 # Get row now as row header might change if a row header
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
106 # collision occurs.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
107 other_row_dict = other_tbl[row_header]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
108
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
109 # Handle row header collisions
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
110 if(row_header in call_tbl):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
111 if(auto_row_header is False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
112 raise DuplicateKeyError(
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
113 "During merge of two table, row headers were "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
114 "found not to be unique across the two tables. "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
115 "Row headers needs to be renamed or the merge "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
116 "method should be called with "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
117 "auto_row_header=True. Note auto row headers will "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
118 "become incrementing integers.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
119 "Calling table: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
120 "Other table: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
121 "Row header: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
122 .format(call_tbl.name, other_tbl.name, row_header))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
123 call_tbl._row_header_count += 1
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
124 row_header = call_tbl._row_header_count
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
125
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
126 call_tbl[row_header] = other_row_dict
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
127
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
128
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
129 class Row(dict):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
130 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
131 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
132 def __init__(self, table):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
133 self.table = table
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
134 super(Row, self).__init__()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
135
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
136 def __setitem__(self, col_header, col_val):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
137 if(not col_header in self.table._headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
138 if(self.table.lock_headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
139 raise LockedObjectError("Attempt to add a header via a Row "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
140 "insertion to a table, where the "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
141 "headers has been locked.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
142 "Table: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
143 "Row header, val: {}, {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
144 "Header: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
145 .format(self.name, col_header, col_val,
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
146 header))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
147 self.table.add_header(col_header)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
148
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
149 super(Row, self).__setitem__(col_header, col_val)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
150
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
151
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
152 class Table(dict):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
153 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
154 Keys of a Table object is considered 'row headers'.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
155 The Key can be None in which case the row header will become an
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
156 increasing integer (starting at 1).
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
157
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
158 Values must be lists of length 2. Where the first entry is the name of
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
159 a column header and the second entry is the value.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
160 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
161 NULL_VAL = "NA"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
162
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
163 def __init__(self, name):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
164 self.name = name
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
165 self.lock_headers = False
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
166
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
167 self._headers = OrderedSet()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
168 self._row_header_count = 0
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
169 self._sort_key = "row_header"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
170 self._sort_list = SortList(container=self)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
171 self._iter_count = 0
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
172
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
173 def add_header(self, header, exist_ok=True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
174 if(self.lock_headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
175 raise LockedObjectError("Attempt to add a header to an object "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
176 "where the headers has been locked.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
177 "Table: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
178 "Header: {}\n".format(self.name, header))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
179
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
180 if(exist_ok is False and header in self._headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
181 raise DuplicateKeyError("Attempt to add header that already exists"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
182 " to table, but the add_header method was "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
183 "called with exist_ok=False.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
184 "Table: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
185 "Header: {}\n".format(self.name, header))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
186 self._headers.add(header)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
187
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
188 def add_headers(self, headers, exist_ok=True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
189 for header in headers:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
190 self.add_header(header, exist_ok)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
191
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
192 def as_txt(self, header=True, sep="\t", sort=True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
193 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
194 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
195 if(sort):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
196 self.set_sort_key(self._sort_key)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
197
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
198 if(header):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
199 out_str = ("{sep}{heads}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
200 .format(sep=sep, heads=sep.join(self._headers)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
201 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
202 out_str = ""
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
203
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
204 for row in self:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
205 row_list = self.get_row_as_list(row, as_txt=True)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
206 out_str += ("{}\n".format(sep.join(row_list)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
207
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
208 return out_str
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
209
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
210
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
211 def extract_column(self, col):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
212 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
213 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
214 if(col == "row_header"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
215 return list(self.keys())
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
216 if(col not in self._headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
217 raise KeyError("Attempt to extract a column that doesn't exist.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
218 "Missing column name: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
219 "Table name: {}".format(col, self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
220 column = []
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
221 for entry in self._sort_list:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
222 row = self[entry._key]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
223 column.append(row.get(col, Table.NULL_VAL))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
224 return column
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
225
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
226 def get_headers(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
227 """ Returns an OrderedSet """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
228 return self._headers
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
229
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
230 def get_row_as_list(self, row_header, as_txt=False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
231 if(row_header not in self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
232 raise KeyError("Unable to find the row_header: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
233 "In Table object named: {}"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
234 .format(row_header, self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
235
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
236 if(as_txt):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
237 row_list = [str(row_header)]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
238 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
239 row_list = [row_header]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
240
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
241 for col_header in self._headers:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
242 if(as_txt):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
243 row_list.append(str(
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
244 self[row_header].get(col_header, Table.NULL_VAL)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
245 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
246 row_list.append(
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
247 self[row_header].get(col_header, Table.NULL_VAL))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
248
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
249 return row_list
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
250
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
251 def get_sort_list(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
252 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
253 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
254 if(self._sort_key is None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
255 raise TypeError("The sort key is None. The sort key needs to be "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
256 "set before calling the get_sort_list method.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
257 "Table: {}".format(self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
258 return self._sort_list
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
259
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
260 def rename_row(self, old_name, new_name):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
261 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
262 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
263 row_dict = self[old_name]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
264 del(self[old_name])
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
265 self._sort_list.remove(old_name)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
266 self[new_name] = row_dict
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
267
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
268 def set_sort_key(self, key, sort=True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
269 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
270 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
271 if(key not in self._headers and key != "row_header"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
272 raise KeyError("Attempt to set sort_key to a value that is not a "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
273 "header.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
274 "Key: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
275 "Available headers: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
276 "Table name: {}"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
277 .format(key, self._headers, self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
278
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
279 self._sort_key = key
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
280
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
281 for i, entry in enumerate(self._sort_list):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
282 if(self._sort_key == "row_header"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
283 entry._val = entry._key
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
284 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
285 row = self[entry._key]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
286 entry._val = row.get(self._sort_key, Table.NULL_VAL)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
287 self._sort_list[i] = entry
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
288
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
289 if(sort is True):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
290 self._sort_list.sort()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
291
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
292 def set_sort_list(self, list):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
293 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
294 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
295 if(_sort_key is None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
296 raise TypeError("The sort key is None. The sort key needs to be "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
297 "set before calling the set_sort_list method.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
298 "Table: {}".format(self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
299 self._sort_list = list
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
300
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
301 def __iter__(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
302 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
303 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
304 self._iter_count = 0
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
305 return self
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
306
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
307 def __next__(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
308 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
309 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
310 if(self._iter_count >= len(self)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
311 raise StopIteration
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
312 entry = self._sort_list[self._iter_count]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
313 self._iter_count += 1
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
314 return entry._key
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
315
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
316 def __setitem__(self, row_header=None, col_val=None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
317 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
318 TODO
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
319 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
320 if(col_val is None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
321 raise TypeError("Column key/value argument must be a dict, list or"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
322 " tuple. Value was None.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
323 "Table: {}".format(self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
324
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
325 if(row_header is None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
326 row_header = self._row_header_count
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
327 self._row_header_count += 1
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
328
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
329 row_dict = self.get(row_header, Row(table=self))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
330
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
331 # If row is not new. Sort key has been added to the sort list
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
332 # previously.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
333 sort_key_added = True
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
334 if(not row_dict):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
335 # If row is new a sort key needs to be added to the sort list.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
336 sort_key_added = False
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
337 if(self._sort_key == "row_header"):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
338 self._sort_list.append(row_header, row_header, ignore_len=True)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
339 sort_key_added = True
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
340
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
341 # Several values must be added as a dict.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
342 if(isinstance(col_val, dict)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
343 for col_name, val in col_val.items():
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
344 if(col_name not in self._headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
345 self.add_header(col_name)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
346 # Add sort key if needed
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
347 if(self._sort_key == col_name and sort_key_added is False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
348 self._sort_list.append(row_header, val, ignore_len=True)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
349 sort_key_added = True
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
350 row_dict[col_name] = val
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
351 # Add sort key if needed
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
352 if(not sort_key_added):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
353 self._sort_list.append(row_header, Table.NULL_VAL,
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
354 ignore_len=True)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
355 return super(Table, self).__setitem__(row_header, row_dict)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
356
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
357 # A single cell value in a table can be added using a list or tuple.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
358 if(isinstance(col_val, list) or isinstance(col_val, tuple)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
359 if(len(col_val) == 2):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
360 if(col_val[0] not in self._headers):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
361 self.add_header(col_val[0])
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
362 row_dict[col_val[0]] = col_val[1]
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
363 return super(Table, self).__setitem__(row_header, row_dict)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
364 else:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
365 raise ValueError("Unexpected number of values. Expected 2. "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
366 "Got: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
367 "Input: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
368 "Table: {}".format(len(col_val), col_val,
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
369 self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
370
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
371 raise TypeError("Unexpected type. The value must be of the type Row, "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
372 "list, or tuple.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
373 "Recieved type: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
374 "Table: {}\n".format(type(col_name), self.name))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
375
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
376
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
377 class ColumnHeader():
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
378 def __init__(self, table, header):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
379 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
380 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
381 table._col_header_count += 1
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
382 self._header = header
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
383 self._index = table._col_header_count
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
384
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
385 def __cmp__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
386 if(not isinstance(other, ColumnHeader)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
387 raise TypeError("A ColumnHeader object cannot be compared to a "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
388 "non-ColumnHeader object.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
389 "ColumnHeader _header: {} _index: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
390 "Other object was of type: {}"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
391 .format(self._header, self._index, type(other)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
392 return super(ColumnHeader, self._index).__cmp__(other._index)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
393
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
394
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
395 class SortList(list):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
396 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
397 Used together with the Table class, as a way to extract rows/data in a
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
398 specific order defined by objects of the type SortList.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
399
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
400 Programmers are meant to sort this list in the desired order and store
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
401 it in a Table class object which will then output rows/data in the
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
402 order defined by the list.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
403
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
404 Implementations details:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
405 The SortList object contain SortListEntries containing key variables
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
406 with unique values which define the order. And value variables which
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
407 is the 'public' values used to sort on.
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
408 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
409 def __init__(self, container=None, unique_list=None, val_list=None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
410 self.container = None
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
411 if(container is not None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
412 self.container = container
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
413
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
414 if(unique_list is None and val_list is None):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
415 return
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
416 if(len(unique_list) != len(val_list)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
417 raise IndexError("A SortList object was initiated with two lists "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
418 "of different sizes.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
419 "len(unique_list) {} != {} len(val_list)"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
420 .format(len(unique_list), len(val_list)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
421
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
422 for i, val in enumerate(val_list):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
423 self.append(unique_list[i], val)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
424
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
425 def append(self, key, val, ignore_len=False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
426 entry = SortListEntry(key, val)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
427 if(self.container is not None and ignore_len is False):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
428 if(len(self.container) != (len(self) + 1)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
429 raise IndexError("Attempt to add an entry to SortList which "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
430 "would cause the list to be longer than the "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
431 "affiliated SortList container.")
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
432 return super(SortList, self).append(entry)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
433
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
434 def remove(self, id):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
435 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
436 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
437 for i, entry in enumerate(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
438 if(id == entry._key):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
439 del(self[i])
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
440
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
441 def __repr__(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
442 outstr_list = []
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
443 for entry in self:
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
444 outstr_list.append("{}\t{}".format(entry._key, entry._val))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
445 return "\n".join(outstr_list)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
446
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
447
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
448 class SortListEntry():
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
449 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
450 """
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
451 def __init__(self, key, val):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
452 self._key = key
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
453 self._val = val
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
454
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
455 def __cmp__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
456 if(not isinstance(other, SortListEntry)):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
457 raise TypeError("A SortListEntry object cannot be compared to a "
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
458 "non-SortListEntry object.\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
459 "SortListEntry key: {} val: {}\n"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
460 "Other object was of type: {}"
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
461 .format(self._key, self._val, type(other)))
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
462
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
463 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
464 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
465 return sort_val.__cmp__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
466
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
467 def __repr__(self):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
468 return "{},{}".format(self._key, self._val)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
469
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
470 def __lt__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
471 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
472 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
473 return sort_val.__lt__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
474
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
475 def __le__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
476 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
477 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
478 return sort_val.__le__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
479
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
480 def __gt__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
481 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
482 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
483 return sort_val.__gt__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
484
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
485 def __ge__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
486 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
487 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
488 return sort_val.__ge__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
489
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
490 def __eq__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
491 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
492 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
493 return sort_val.__eq__(sort_val_other)
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
494
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
495 def __ne__(self, other):
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
496 sort_val = str(self._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
497 sort_val_other = str(other._val).lower()
55051a9bc58d Uploaded
dcouvin
parents:
diff changeset
498 return sort_val.__ne__(sort_val_other)