Source code for swh.scheduler.cli.click_utils
# Copyright (C) 2026 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
from datetime import datetime
from email.utils import parsedate_to_datetime
from typing import Any, Callable, Optional
import click
from dateparser import parse as dateparser
from dateutil.parser import ParserError as DateUtilParserError
from dateutil.parser import parse as dateutil
[docs]
class DateConvert:
def __init__(self, name: str, converter: Callable[[str], Optional[datetime]]):
self.convert = converter
self.name = name
def __repr__(self) -> str:
return self.name
[docs]
class DateTimeMoreParsers(click.types.DateTime):
def __init__(self):
super().__init__()
self.formats += [
DateConvert("ISO 8601", datetime.fromisoformat),
DateConvert("RFC 822/2822/5322", parsedate_to_datetime),
DateConvert("dateutil", lambda value: dateutil(value, fuzzy=True)),
DateConvert("dateparser", dateparser),
]
def _try_to_convert_date(self, value: Any, parser: Any) -> Optional[datetime]:
if isinstance(parser, str):
return super()._try_to_convert_date(value, parser)
elif isinstance(parser, DateConvert):
try:
return parser.convert(value)
except (ValueError, DateUtilParserError):
return None
elif parser is not None:
raise ValueError(f"Unknown date parser {parser}")
else:
return None
DATETIME = DateTimeMoreParsers()
if __name__ == "__main__":
import sys
for arg in sys.argv[1:]:
print(DATETIME.convert(arg, None, None))