From 13ddc5a1f945dab5b06513bf4daa60ce33ea7e1d Mon Sep 17 00:00:00 2001 From: drewcassidy Date: Sun, 18 Apr 2021 22:01:31 -0700 Subject: [PATCH] Gracefully handle H2s that dont match the schema --- yaclog/changelog.py | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/yaclog/changelog.py b/yaclog/changelog.py index 32d4127..19a6389 100644 --- a/yaclog/changelog.py +++ b/yaclog/changelog.py @@ -66,7 +66,8 @@ class VersionEntry: self.date: Optional[datetime.date] = None self.tags: List[str] = [] self.link: str = '' - self.line_no = -1 + self.link_id: str = None + self.line_no: int = -1 def __str__(self) -> str: if self.link: @@ -74,8 +75,11 @@ class VersionEntry: else: segments = [self.name] + if self.date or len(self.tags) > 0: + segments.append('-') + if self.date: - segments += ['-', self.date.isoformat()] + segments.append(self.date.isoformat()) segments += [f'[{t.upper()}]' for t in self.tags] @@ -159,24 +163,36 @@ class Changelog: if segment[2] == 'h2': # start of a version - split = text.rstrip('-').strip('#').strip().split() + slug = text.rstrip('-').strip('#').strip() + split = slug.split() if '-' in split: split.remove('-') version = VersionEntry() section = '' - version.name, version.link, version.link_id = _strip_link(split[0]) + version.name = slug version.line_no = segment[0] - - if len(split) > 1: - try: - version.date = datetime.date.fromisoformat(split[1].strip(string.punctuation)) - except ValueError: - version.date = None - - if len(split) > 2: - version.tags = [s.strip('[]') for s in split[2:]] + tags = [] + date = [] + + for word in split[1:]: + if match := re.match(r'\d{4}-\d{2}-\d{2}', word): + # date + try: + date = datetime.date.fromisoformat(match[0]) + except ValueError: + break + elif match := re.match(r'^\[(?P\S*)]', word): + tags.append(match['tag']) + else: + break + + else: + # matches the schema + version.name, version.link, version.link_id = _strip_link(split[0]) + version.date = date + version.tags = tags self.versions.append(version)