Merged in [9641] from rjsparks@nostrum.com:
Make parsing IANA mail for comments more flexible.
- Legacy-Id: 9659
Note: SVN reference [9641] has been migrated to Git commit dd939e8196
This commit is contained in:
commit
41dcd53842
|
@ -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 = ""
|
||||
|
||||
|
|
|
@ -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,32 +155,44 @@ ICANN
|
|||
(END IANA %(tag)s)
|
||||
"""
|
||||
|
||||
tags = ("LAST CALL COMMENTS","COMMENTS")
|
||||
for tag in tags:
|
||||
msg = msg_template % dict(person=Person.objects.get(user__username="iana").name,
|
||||
draft=draft.name,
|
||||
rev=draft.rev,
|
||||
tag=tag,
|
||||
rtime=tags.index(tag))
|
||||
|
||||
doc_name, review_time, by, comment = iana.parse_review_email(msg.encode('utf-8'))
|
||||
subjects = ( subject_template % dict(draft=draft.name,rev=draft.rev) , 'Subject: Vacuous Subject' )
|
||||
|
||||
self.assertEqual(doc_name, draft.name)
|
||||
# self.assertEqual(review_time, datetime.datetime(2012, 5, 10, 5, 0, 0))
|
||||
self.assertEqual(by, Person.objects.get(user__username="iana"))
|
||||
self.assertTrue("there are no IANA Actions" in comment.replace("\n", ""))
|
||||
tags = ('LAST CALL COMMENTS', 'COMMENTS')
|
||||
|
||||
events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count()
|
||||
iana.add_review_comment(doc_name, review_time, by, comment)
|
||||
embedded_names = (': %s-%s.txt'%(draft.name,draft.rev), '')
|
||||
|
||||
e = draft.latest_event(type="iana_review")
|
||||
self.assertTrue(e)
|
||||
self.assertEqual(e.desc, comment)
|
||||
self.assertEqual(e.by, by)
|
||||
|
||||
# make sure it doesn't create duplicates
|
||||
iana.add_review_comment(doc_name, review_time, by, comment)
|
||||
self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1)
|
||||
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=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, rtime))
|
||||
self.assertEqual(by, Person.objects.get(user__username="iana"))
|
||||
self.assertTrue("there are no IANA Actions" in comment.replace("\n", ""))
|
||||
|
||||
events_before = DocEvent.objects.filter(doc=draft, type="iana_review").count()
|
||||
iana.add_review_comment(doc_name, review_time, by, comment)
|
||||
|
||||
e = draft.latest_event(type="iana_review")
|
||||
self.assertTrue(e)
|
||||
self.assertEqual(e.desc, comment)
|
||||
self.assertEqual(e.by, by)
|
||||
|
||||
# make sure it doesn't create duplicates
|
||||
iana.add_review_comment(doc_name, review_time, by, comment)
|
||||
self.assertEqual(DocEvent.objects.filter(doc=draft, type="iana_review").count(), events_before+1)
|
||||
|
||||
def test_notify_page(self):
|
||||
# check that we can get the notify page
|
||||
|
|
Loading…
Reference in a new issue