Make parsing IANA mail for comments more flexible. Commit ready for merge.

- Legacy-Id: 9641
This commit is contained in:
Robert Sparks 2015-05-22 19:12:07 +00:00
parent 87ce060164
commit dd939e8196
2 changed files with 69 additions and 42 deletions

View file

@ -215,19 +215,29 @@ def update_history_with_changes(changes, send_email=True):
return added_events, warnings
def find_document_name(text):
prefixes = ['draft','conflict-review','status-change','charter']
leading_delimiter_re = '(?<![-a-zA-Z0-9])'
prefix_re = '(%s)' % '|'.join(prefixes)
tail_re = '(-[a-z0-9]+)+?(-\d\d\.txt)?'
trailing_delimiter_re = '((?![-a-zA-Z0-9])|$)'
name_re = '%s(%s%s)%s' % (leading_delimiter_re, prefix_re, tail_re, trailing_delimiter_re)
m = re.search(name_re,text)
return m and m.group(0).lower()
def strip_version_extension(text):
if re.search(r"\.\w{3}$", text): # strip off extension
text = text[:-4]
if re.search(r"-\d{2}$", text): # strip off revision
text = text[:-3]
return text
def parse_review_email(text):
msg = email.message_from_string(text)
# doc
doc_name = ""
m = re.search(r"<([^>]+)>", msg["Subject"])
if m:
doc_name = m.group(1).lower()
if re.search(r"\.\w{3}$", doc_name): # strip off extension
doc_name = doc_name[:-4]
if re.search(r"-\d{2}$", doc_name): # strip off revision
doc_name = doc_name[:-3]
doc_name = find_document_name(msg["Subject"]) or ""
doc_name = strip_version_extension(doc_name)
# date
review_time = datetime.datetime.now()
@ -252,14 +262,18 @@ def parse_review_email(text):
# comment
body = msg.get_payload().decode('quoted-printable').replace("\r", "")
if "BEGIN IANA LAST CALL COMMENTS" in body:
b = body.find("(BEGIN IANA LAST CALL COMMENTS)")
e = body.find("(END IANA LAST CALL COMMENTS)")
comment = body[b + len("(BEGIN IANA LAST CALL COMMENTS)"):e].strip()
elif "BEGIN IANA COMMENTS" in body:
b = body.find("(BEGIN IANA COMMENTS)")
e = body.find("(END IANA COMMENTS)")
comment = body[b + len("(BEGIN IANA COMMENTS)"):e].strip()
begin_search = re.search('\(BEGIN\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?(\s*:\s*[a-zA-Z0-9-\.]*)?\s*\)',body)
end_search = re.search('\(END\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?\)',body)
if begin_search and end_search:
begin_string = begin_search.group(0)
end_string = end_search.group(0)
b = body.find(begin_string)
e = body.find(end_string)
comment = body[b + len(begin_string):e].strip()
embedded_name = strip_version_extension(find_document_name(begin_string) or "")
if embedded_name:
doc_name = embedded_name
else:
comment = ""

View file

@ -131,11 +131,12 @@ class IANASyncTests(TestCase):
def test_iana_review_mail(self):
draft = make_test_data()
subject_template = u'Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC'
msg_template = u"""From: "%(person)s via RT" <drafts-lastcall@iana.org>
Date: Thu, 10 May 2012 12:00:0%(rtime)d +0000
Subject: [IANA #12345] Last Call: <%(draft)s-%(rev)s.txt> (Long text) to Informational RFC
%(subject)s
(BEGIN IANA %(tag)s)
(BEGIN IANA %(tag)s%(embedded_name)s)
IESG:
@ -154,18 +155,30 @@ ICANN
(END IANA %(tag)s)
"""
tags = ("LAST CALL COMMENTS","COMMENTS")
subjects = ( subject_template % dict(draft=draft.name,rev=draft.rev) , 'Subject: Vacuous Subject' )
tags = ('LAST CALL COMMENTS', 'COMMENTS')
embedded_names = (': %s-%s.txt'%(draft.name,draft.rev), '')
for subject in subjects:
for tag in tags:
for embedded_name in embedded_names:
if embedded_name or not 'Vacuous' in subject:
rtime = 7*subjects.index(subject) + 5*tags.index(tag) + embedded_names.index(embedded_name)
msg = msg_template % dict(person=Person.objects.get(user__username="iana").name,
draft=draft.name,
rev=draft.rev,
tag=tag,
rtime=tags.index(tag))
rtime=rtime,
subject=subject,
embedded_name=embedded_name,)
doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8'))
self.assertEqual(doc_name, draft.name)
# self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, 0))
self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, rtime))
self.assertEqual(by, Person.objects.get(user__username="iana"))
self.assertTrue("there are no IANA Actions" in comment.replace("\n", ""))