Skip to content

Commit dd939e8

Browse files
committed
Make parsing IANA mail for comments more flexible. Commit ready for merge.
- Legacy-Id: 9641
1 parent 87ce060 commit dd939e8

2 files changed

Lines changed: 72 additions & 45 deletions

File tree

ietf/sync/iana.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -215,19 +215,29 @@ def update_history_with_changes(changes, send_email=True):
215215
return added_events, warnings
216216

217217

218+
def find_document_name(text):
219+
prefixes = ['draft','conflict-review','status-change','charter']
220+
leading_delimiter_re = '(?<![-a-zA-Z0-9])'
221+
prefix_re = '(%s)' % '|'.join(prefixes)
222+
tail_re = '(-[a-z0-9]+)+?(-\d\d\.txt)?'
223+
trailing_delimiter_re = '((?![-a-zA-Z0-9])|$)'
224+
name_re = '%s(%s%s)%s' % (leading_delimiter_re, prefix_re, tail_re, trailing_delimiter_re)
225+
m = re.search(name_re,text)
226+
return m and m.group(0).lower()
227+
228+
def strip_version_extension(text):
229+
if re.search(r"\.\w{3}$", text): # strip off extension
230+
text = text[:-4]
231+
if re.search(r"-\d{2}$", text): # strip off revision
232+
text = text[:-3]
233+
return text
234+
218235
def parse_review_email(text):
219236
msg = email.message_from_string(text)
220237

221238
# doc
222-
doc_name = ""
223-
m = re.search(r"<([^>]+)>", msg["Subject"])
224-
if m:
225-
doc_name = m.group(1).lower()
226-
if re.search(r"\.\w{3}$", doc_name): # strip off extension
227-
doc_name = doc_name[:-4]
228-
229-
if re.search(r"-\d{2}$", doc_name): # strip off revision
230-
doc_name = doc_name[:-3]
239+
doc_name = find_document_name(msg["Subject"]) or ""
240+
doc_name = strip_version_extension(doc_name)
231241

232242
# date
233243
review_time = datetime.datetime.now()
@@ -252,14 +262,18 @@ def parse_review_email(text):
252262

253263
# comment
254264
body = msg.get_payload().decode('quoted-printable').replace("\r", "")
255-
if "BEGIN IANA LAST CALL COMMENTS" in body:
256-
b = body.find("(BEGIN IANA LAST CALL COMMENTS)")
257-
e = body.find("(END IANA LAST CALL COMMENTS)")
258-
comment = body[b + len("(BEGIN IANA LAST CALL COMMENTS)"):e].strip()
259-
elif "BEGIN IANA COMMENTS" in body:
260-
b = body.find("(BEGIN IANA COMMENTS)")
261-
e = body.find("(END IANA COMMENTS)")
262-
comment = body[b + len("(BEGIN IANA COMMENTS)"):e].strip()
265+
266+
begin_search = re.search('\(BEGIN\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?(\s*:\s*[a-zA-Z0-9-\.]*)?\s*\)',body)
267+
end_search = re.search('\(END\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?\)',body)
268+
if begin_search and end_search:
269+
begin_string = begin_search.group(0)
270+
end_string = end_search.group(0)
271+
b = body.find(begin_string)
272+
e = body.find(end_string)
273+
comment = body[b + len(begin_string):e].strip()
274+
embedded_name = strip_version_extension(find_document_name(begin_string) or "")
275+
if embedded_name:
276+
doc_name = embedded_name
263277
else:
264278
comment = ""
265279

ietf/sync/tests.py

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,12 @@ def test_changes_sync_errors(self):
131131
def test_iana_review_mail(self):
132132
draft = make_test_data()
133133

134+
subject_template = u'Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC'
134135
msg_template = u"""From: "%(person)s via RT" <drafts-lastcall@iana.org>
135136
Date: Thu, 10 May 2012 12:00:0%(rtime)d +0000
136-
Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC
137+
%(subject)s
137138
138-
(BEGIN IANA %(tag)s)
139+
(BEGIN IANA %(tag)s%(embedded_name)s)
139140
140141
IESG:
141142
@@ -154,32 +155,44 @@ def test_iana_review_mail(self):
154155
(END IANA %(tag)s)
155156
"""
156157

157-
tags = ("LAST CALL COMMENTS","COMMENTS")
158-
for tag in tags:
159-
msg = msg_template % dict(person=Person.objects.get(user__username="iana").name,
160-
draft=draft.name,
161-
rev=draft.rev,
162-
tag=tag,
163-
rtime=tags.index(tag))
164-
165-
doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8'))
166-
167-
self.assertEqual(doc_name, draft.name)
168-
# self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, 0))
169-
self.assertEqual(by, Person.objects.get(user__username="iana"))
170-
self.assertTrue("there are no IANA Actions" in comment.replace("\n", ""))
171-
172-
events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count()
173-
iana.add_review_comment(doc_name, review_time, by, comment)
174-
175-
e = draft.latest_event(type="iana_review")
176-
self.assertTrue(e)
177-
self.assertEqual(e.desc, comment)
178-
self.assertEqual(e.by, by)
179-
180-
# make sure it doesn't create duplicates
181-
iana.add_review_comment(doc_name, review_time, by, comment)
182-
self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1)
158+
subjects = ( subject_template % dict(draft=draft.name,rev=draft.rev) , 'Subject: Vacuous Subject' )
159+
160+
tags = ('LAST CALL COMMENTS', 'COMMENTS')
161+
162+
embedded_names = (': %s-%s.txt'%(draft.name,draft.rev), '')
163+
164+
for subject in subjects:
165+
for tag in tags:
166+
for embedded_name in embedded_names:
167+
if embedded_name or not 'Vacuous' in subject:
168+
169+
rtime = 7*subjects.index(subject) + 5*tags.index(tag) + embedded_names.index(embedded_name)
170+
msg = msg_template % dict(person=Person.objects.get(user__username="iana").name,
171+
draft=draft.name,
172+
rev=draft.rev,
173+
tag=tag,
174+
rtime=rtime,
175+
subject=subject,
176+
embedded_name=embedded_name,)
177+
178+
doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8'))
179+
180+
self.assertEqual(doc_name, draft.name)
181+
self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, rtime))
182+
self.assertEqual(by, Person.objects.get(user__username="iana"))
183+
self.assertTrue("there are no IANA Actions" in comment.replace("\n", ""))
184+
185+
events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count()
186+
iana.add_review_comment(doc_name, review_time, by, comment)
187+
188+
e = draft.latest_event(type="iana_review")
189+
self.assertTrue(e)
190+
self.assertEqual(e.desc, comment)
191+
self.assertEqual(e.by, by)
192+
193+
# make sure it doesn't create duplicates
194+
iana.add_review_comment(doc_name, review_time, by, comment)
195+
self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1)
183196

184197
def test_notify_page(self):
185198
# check that we can get the notify page

0 commit comments

Comments
 (0)