Skip to content

Commit 8179733

Browse files
committed
Type fixes for versioning.py
- use the _Element/_ElementTree class instead of the Element/ElementTree factory for typing - expect None values returned by lxml - other minor fixes
1 parent fe71813 commit 8179733

File tree

1 file changed

+42
-29
lines changed

1 file changed

+42
-29
lines changed

GTG/core/versioning.py

+42-29
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
tid_cache = {}
3838

3939

40-
def convert(path: str) -> et.ElementTree:
40+
def convert(path: str) -> et._ElementTree:
4141
"""Convert old XML into the new format."""
4242

4343
old_tree = xml.open_file(path, 'project')
@@ -75,7 +75,7 @@ def convert(path: str) -> et.ElementTree:
7575
return et.ElementTree(new_root)
7676

7777

78-
def convert_tags(old_tree: et.Element) -> Tuple[et.Element, et.Element]:
78+
def convert_tags(old_tree: et._Element) -> Tuple[et._Element, et._Element]:
7979
"""Convert old tags for the new format."""
8080

8181
old_file = os.path.join(DATA_DIR, 'tags.xml')
@@ -123,7 +123,9 @@ def convert_tags(old_tree: et.Element) -> Tuple[et.Element, et.Element]:
123123
# through the tasks to make sure we get *all* tags and have
124124
# their IDs ready for task conversion.
125125
for task in old_tree.iter('task'):
126-
for tag_name in task.get('tags').split(','):
126+
tags_str = task.get('tags')
127+
assert tags_str is not None, "Missing tags property in old task."
128+
for tag_name in tags_str.split(','):
127129
if tag_name and tag_name not in tags_cache:
128130
new_tag = et.SubElement(taglist, 'tag')
129131
tid = str(uuid4())
@@ -135,7 +137,7 @@ def convert_tags(old_tree: et.Element) -> Tuple[et.Element, et.Element]:
135137
return taglist, searchlist
136138

137139

138-
def convert_task(task: et.Element) -> Optional[et.Element]:
140+
def convert_task(task: et._Element) -> Optional[et._Element]:
139141
"""Convert old task XML into the new format."""
140142

141143
if task is None:
@@ -145,34 +147,42 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
145147

146148
# Get the old task properties
147149
# TIDs were stored as UUID, but sometimes they were not present
148-
tid = task.get('uuid') or uuid4() or tid_cache[tid]
150+
tid = task.get('uuid') or str(uuid4())
149151
status = task.get('status')
150-
title = task.find('title').text
152+
assert status is not None, 'Missing status property in old task.'
153+
title_element = task.find('title')
154+
assert title_element is not None, 'Missing title element in old task.'
155+
title = title_element.text
151156
content = task.find('content')
152157

153-
try:
154-
done_date = task.find('donedate').text
155-
except AttributeError:
158+
donedate_element = task.find('donedate')
159+
if donedate_element is not None:
160+
done_date = donedate_element.text
161+
else:
156162
done_date = None
157163

158-
try:
159-
due_date = task.find('duedate').text
160-
except AttributeError:
164+
duedate_element = task.find('duedate')
165+
if duedate_element is not None:
166+
due_date = duedate_element.text
167+
else:
161168
due_date = None
162169

163-
try:
164-
modified = task.find('modified').text
165-
except AttributeError:
170+
modified_element = task.find('modified')
171+
if modified_element is not None:
172+
modified = modified_element.text
173+
else:
166174
modified = None
167175

168-
try:
169-
added = task.find('added').text
170-
except AttributeError:
176+
added_element = task.find('added')
177+
if added_element is not None:
178+
added = added_element.text
179+
else:
171180
added = None
172181

173-
try:
174-
start = task.find('startdate').text
175-
except AttributeError:
182+
startdate_element = task.find('startdate')
183+
if startdate_element is not None:
184+
start = startdate_element.text
185+
else:
176186
start = None
177187

178188

@@ -187,7 +197,9 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
187197

188198
tags = et.SubElement(new_task, 'tags')
189199

190-
for tag_name in task.get('tags').split(','):
200+
tags_str = task.get('tags')
201+
assert tags_str is not None, 'Missing tags property in old task.'
202+
for tag_name in tags_str.split(','):
191203
if tag_name:
192204
tag_id = tags_cache[tag_name]
193205
task_tag = et.SubElement(tags, 'tag')
@@ -217,24 +229,24 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
217229
new_done.text = str(Date(done_date))
218230

219231
if start:
220-
start = Date(start)
232+
tmp_start = Date(start)
221233

222-
if start.is_fuzzy():
234+
if tmp_start.is_fuzzy():
223235
new_start = et.SubElement(dates, 'fuzzyStart')
224236
else:
225237
new_start = et.SubElement(dates, 'start')
226238

227-
new_start.text = str(start)
239+
new_start.text = str(tmp_start)
228240

229241
if due_date:
230-
due_date = Date(due_date)
242+
tmp_due_date = Date(due_date)
231243

232-
if due_date.is_fuzzy():
244+
if tmp_due_date.is_fuzzy():
233245
new_due = et.SubElement(dates, 'fuzzyDue')
234246
else:
235247
new_due = et.SubElement(dates, 'due')
236248

237-
new_due.text = str(due_date)
249+
new_due.text = str(tmp_due_date)
238250

239251
recurring = et.SubElement(new_task, 'recurring')
240252
recurring.set('enabled', 'false')
@@ -248,7 +260,8 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
248260
new_content = et.SubElement(new_task, 'content')
249261

250262
if content is not None:
251-
new_content.text = et.CDATA(convert_content(content.text))
263+
content_text = content.text or ''
264+
new_content.text = et.CDATA(convert_content(content_text))
252265
else:
253266
new_content.text = et.CDATA('')
254267

0 commit comments

Comments
 (0)