Skip to content

Commit ecc823e

Browse files
feat: Give better errors when docName is missing (#7083)
* feat: Give better error when docName is missing * refactor: Make method static for easier testing * test: Add test of XMLDraft.parse_docname()
1 parent 89d2a0c commit ecc823e

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

ietf/utils/tests.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import datetime
66
import io
77
import json
8+
import lxml.etree
89
import os.path
910
import pytz
1011
import shutil
@@ -450,6 +451,41 @@ def test_parse_creation_date(self):
450451
datetime.date(today.year, 1 if today.month != 1 else 2, 15),
451452
)
452453

454+
def test_parse_docname(self):
455+
with self.assertRaises(ValueError) as cm:
456+
XMLDraft.parse_docname(lxml.etree.Element("xml")) # no docName
457+
self.assertIn("Missing docName attribute", str(cm.exception))
458+
459+
# There to be more invalid docNames, but we use XMLDraft in places where we don't
460+
# actually care about the validation, so for now just test what has long been the
461+
# implementation.
462+
with self.assertRaises(ValueError) as cm:
463+
XMLDraft.parse_docname(lxml.etree.Element("xml", docName="")) # not a valid docName
464+
self.assertIn("Unable to parse docName", str(cm.exception))
465+
466+
self.assertEqual(
467+
XMLDraft.parse_docname(lxml.etree.Element("xml", docName="draft-foo-bar-baz-01")),
468+
("draft-foo-bar-baz", "01"),
469+
)
470+
471+
self.assertEqual(
472+
XMLDraft.parse_docname(lxml.etree.Element("xml", docName="draft-foo-bar-baz")),
473+
("draft-foo-bar-baz", None),
474+
)
475+
476+
self.assertEqual(
477+
XMLDraft.parse_docname(lxml.etree.Element("xml", docName="draft-foo-bar-baz-")),
478+
("draft-foo-bar-baz-", None),
479+
)
480+
481+
# This is awful, but is how we've been running for some time. The missing rev will trigger
482+
# validation errors for submissions, so we're at least somewhat guarded against this
483+
# property.
484+
self.assertEqual(
485+
XMLDraft.parse_docname(lxml.etree.Element("xml", docName="-01")),
486+
("-01", None),
487+
)
488+
453489

454490
class NameTests(TestCase):
455491

ietf/utils/xmldraft.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def __init__(self, xml_file):
2929
# cast xml_file to str so, e.g., this will work with a Path
3030
self.xmltree, self.xml_version = self.parse_xml(str(xml_file))
3131
self.xmlroot = self.xmltree.getroot()
32-
self.filename, self.revision = self._parse_docname()
32+
self.filename, self.revision = self.parse_docname(self.xmlroot)
3333

3434
@staticmethod
3535
def parse_xml(filename):
@@ -125,8 +125,11 @@ def _reference_section_name(self, section_elt):
125125
section_name = section_elt.get('title') # fall back to title if we have it
126126
return section_name
127127

128-
def _parse_docname(self):
129-
docname = self.xmlroot.attrib.get('docName')
128+
@staticmethod
129+
def parse_docname(xmlroot):
130+
docname = xmlroot.attrib.get('docName')
131+
if docname is None:
132+
raise ValueError("Missing docName attribute in the XML root element")
130133
revmatch = re.match(
131134
r'^(?P<filename>.+?)(?:-(?P<rev>[0-9][0-9]))?$',
132135
docname,

0 commit comments

Comments
 (0)