37
37
tid_cache = {}
38
38
39
39
40
- def convert (path : str ) -> et .ElementTree :
40
+ def convert (path : str ) -> et ._ElementTree :
41
41
"""Convert old XML into the new format."""
42
42
43
43
old_tree = xml .open_file (path , 'project' )
@@ -75,7 +75,7 @@ def convert(path: str) -> et.ElementTree:
75
75
return et .ElementTree (new_root )
76
76
77
77
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 ]:
79
79
"""Convert old tags for the new format."""
80
80
81
81
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]:
123
123
# through the tasks to make sure we get *all* tags and have
124
124
# their IDs ready for task conversion.
125
125
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 (',' ):
127
129
if tag_name and tag_name not in tags_cache :
128
130
new_tag = et .SubElement (taglist , 'tag' )
129
131
tid = str (uuid4 ())
@@ -135,7 +137,7 @@ def convert_tags(old_tree: et.Element) -> Tuple[et.Element, et.Element]:
135
137
return taglist , searchlist
136
138
137
139
138
- def convert_task (task : et .Element ) -> Optional [et .Element ]:
140
+ def convert_task (task : et ._Element ) -> Optional [et ._Element ]:
139
141
"""Convert old task XML into the new format."""
140
142
141
143
if task is None :
@@ -145,34 +147,42 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
145
147
146
148
# Get the old task properties
147
149
# 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 ())
149
151
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
151
156
content = task .find ('content' )
152
157
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 :
156
162
done_date = None
157
163
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 :
161
168
due_date = None
162
169
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 :
166
174
modified = None
167
175
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 :
171
180
added = None
172
181
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 :
176
186
start = None
177
187
178
188
@@ -187,7 +197,9 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
187
197
188
198
tags = et .SubElement (new_task , 'tags' )
189
199
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 (',' ):
191
203
if tag_name :
192
204
tag_id = tags_cache [tag_name ]
193
205
task_tag = et .SubElement (tags , 'tag' )
@@ -217,24 +229,24 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
217
229
new_done .text = str (Date (done_date ))
218
230
219
231
if start :
220
- start = Date (start )
232
+ tmp_start = Date (start )
221
233
222
- if start .is_fuzzy ():
234
+ if tmp_start .is_fuzzy ():
223
235
new_start = et .SubElement (dates , 'fuzzyStart' )
224
236
else :
225
237
new_start = et .SubElement (dates , 'start' )
226
238
227
- new_start .text = str (start )
239
+ new_start .text = str (tmp_start )
228
240
229
241
if due_date :
230
- due_date = Date (due_date )
242
+ tmp_due_date = Date (due_date )
231
243
232
- if due_date .is_fuzzy ():
244
+ if tmp_due_date .is_fuzzy ():
233
245
new_due = et .SubElement (dates , 'fuzzyDue' )
234
246
else :
235
247
new_due = et .SubElement (dates , 'due' )
236
248
237
- new_due .text = str (due_date )
249
+ new_due .text = str (tmp_due_date )
238
250
239
251
recurring = et .SubElement (new_task , 'recurring' )
240
252
recurring .set ('enabled' , 'false' )
@@ -248,7 +260,8 @@ def convert_task(task: et.Element) -> Optional[et.Element]:
248
260
new_content = et .SubElement (new_task , 'content' )
249
261
250
262
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 ))
252
265
else :
253
266
new_content .text = et .CDATA ('' )
254
267
0 commit comments