Skip to content

Commit 5e18917

Browse files
committed
Reapply fixes
1 parent e092262 commit 5e18917

File tree

2 files changed

+43
-44
lines changed

2 files changed

+43
-44
lines changed

vit/config_parser.py

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -277,14 +277,27 @@ def get_projects(self):
277277
else:
278278
raise RuntimeError('Error parsing task projects: %s' % stderr)
279279

280-
def get_uda_values(self, uda_name):
281-
uda_values = self.subtree(f'uda.{uda_name}.values')
282-
if uda_values:
283-
return uda_values.split(',')
284-
return None
285-
286280
def get_priority_values(self):
287-
return self.get_uda_values('priority')
281+
return self.subtree('uda.priority.values').split(',')
282+
283+
def is_string_uda(self, uda_data):
284+
return 'type' in uda_data and uda_data['type'].strip() == 'string'
285+
286+
def parse_uda_string_values(self, uda_data):
287+
if 'values' in uda_data:
288+
values_list = uda_data['values'].split(',')
289+
values_index = {v: i for i, v in enumerate(values_list)}
290+
return values_list, values_index
291+
return None, None
292+
293+
def get_uda_config(self):
294+
uda_config = self.subtree('uda.')
295+
for uda_data in uda_config.values():
296+
if self.is_string_uda(uda_data):
297+
values_list, values_index = self.parse_uda_string_values(uda_data)
298+
uda_data['values_list'] = values_list
299+
uda_data['values_index'] = values_index
300+
return uda_config
288301

289302
def is_string_uda(self, uda_data):
290303
return 'type' in uda_data and uda_data['type'].strip() == 'string'

vit/task_list.py

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from vit.base_list_box import BaseListBox
1414
from vit.list_batcher import ListBatcher
1515
from vit.formatter.project import Project as ProjectFormatter
16-
from vit.config_parser import TaskParser
1716
from vit.util import unicode_len
1817

1918

@@ -177,43 +176,30 @@ def flash_focus(self, repeat_times=None, pause_seconds=None):
177176

178177
def sort(self):
179178
if 'sort' in self.report:
180-
self.task_parser = TaskParser(self.config)
181-
uda_config = self.task_parser.subtree('uda.')
182-
DEFAULT_COLUMNS = {'depends', 'description', 'due', 'end', 'entry', 'id', 'imask', 'last', 'mask', 'modified', 'parent', 'project', 'recur', 'rtype', 'scheduled', 'start', 'status', 'tags', 'template', 'until', 'urgency', 'uuid', 'wait'}
183-
# except 'priority' as UDA
184-
185-
def default_comparator(first, second):
186-
if first[column] is not None and second[column] is not None:
187-
return -1 if first[column] < second[column] else 1 if first[column] > second[column] else 0
188-
elif first[column] is None and second[column] is None:
189-
return 0
190-
elif first[column] is not None and second[column] is None:
191-
return -1
192-
elif first[column] is None and second[column] is not None:
193-
return 1
194-
195-
def string_comparator(uda_index, first, second):
196-
a, b = first[column], second[column]
197-
a_index = uda_index.get(a or '', len(uda_index))
198-
b_index = uda_index.get(b or '', len(uda_index))
199-
return (a_index > b_index) - (a_index < b_index)
200-
201179
for column, order, collate in reversed(self.report['sort']):
202-
if column.strip() in DEFAULT_COLUMNS:
203-
comparator = default_comparator
204-
else: # UDA, priority
205-
uda_values = uda_config[column].get('values')
206-
uda_type = uda_config[column].get('type')
207-
if uda_type.strip() == 'string':
208-
if uda_values: # has .values
209-
uda_values_list = uda_values.rstrip(',').split(',')
210-
uda_index = {v: i for i, v in enumerate(uda_values_list)}
211-
comparator = partial(string_comparator, uda_index)
212-
else: # has no .values
213-
comparator = default_comparator
214-
else: # numeric, date, duration
215-
comparator = default_comparator
216-
180+
def comparator_default(first, second):
181+
if first[column] is not None and second[column] is not None:
182+
return -1 if first[column] < second[column] else 1 if first[column] > second[column] else 0
183+
elif first[column] is None and second[column] is None:
184+
return 0
185+
elif first[column] is not None and second[column] is None:
186+
return -1
187+
elif first[column] is None and second[column] is not None:
188+
return 1
189+
190+
def comparator_uda_string(values_index, first, second):
191+
a, b = first[column], second[column]
192+
default_index = len(values_index)
193+
a_index = values_index.get(a or '', default_index)
194+
b_index = values_index.get(b or '', default_index)
195+
return (a_index > b_index) - (a_index < b_index)
196+
197+
uda = self.task_config.uda_config.get(column)
198+
if uda != None and uda.get('type') == 'string':
199+
values_index = uda.get('values_index')
200+
comparator = partial(comparator_uda_string, values_index)
201+
else:
202+
comparator = comparator_default
217203
if order and order == 'descending':
218204
self.tasks = sorted(self.tasks, key=cmp_to_key(comparator), reverse=True)
219205
else:

0 commit comments

Comments
 (0)