diff --git a/src/common/dates.py b/src/common/dates.py index 29f2b907..1dc38e81 100644 --- a/src/common/dates.py +++ b/src/common/dates.py @@ -93,6 +93,15 @@ def parse_datetime(text: str, formats: list[str] = frozenset([ raise ValueError(msg) +def parse__datetime_or_date_or_month_year_date(text: str) -> datetime.datetime: + """Parse a given text representing a datetime, date or a partial date using the default list of formats. + """ + try: + return parse_datetime(text) + except ValueError: + return parse_date_or_month_year_date(text) + + def date(year: int, month: int, day: int) -> datetime.datetime: """Create a datetime object with the given year, month and day, at midnight.""" return datetime.datetime(year, month, day, tzinfo=datetime.timezone.utc) diff --git a/src/release_table.py b/src/release_table.py index e52c71c4..1aa55ae7 100644 --- a/src/release_table.py +++ b/src/release_table.py @@ -138,16 +138,13 @@ class Field: str_value = self.template.render(**match.groupdict()) if self.template else raw_value if self.type == "date": - try: - return dates.parse_date(str_value) - except ValueError: - return dates.parse_month_year_date(str_value) + return dates.parse_date_or_month_year_date(str_value) - elif self.type == "range": + if self.type == "range": items = RANGE_LIST_SEPARATOR_PATTERN.split(str_value) return f"{items[0]} - {items[-1]}" if len(items) > 1 else str_value - elif self.type == "identifier": + if self.type == "identifier": return endoflife.to_identifier(str_value) return str_value diff --git a/src/version_table.py b/src/version_table.py index 7c60a606..190ceeb8 100644 --- a/src/version_table.py +++ b/src/version_table.py @@ -59,7 +59,7 @@ with ProductData(config.product) as product_data: continue version_name = config.render(version_match) - version_date = dates.parse_datetime(cells[version_date_index]) + version_date = dates.parse__datetime_or_date_or_month_year_date(cells[version_date_index]) product_data.declare_version(version_name, version_date) except ValueError as e: