def datetime_parse(string_value, **_): for iso_format in datetime_iso_formats: try: return datetime.strptime(string_value, iso_format) except ValueError: pass result = parse_relative_datetime(string_value) if result is None: formats = ', '.join('"%s"' % x for x in datetime_iso_formats) raise ValidationError(f'Time data "{string_value}" does not match any of the formats "now", {formats}, and is not a relative date like "2d" or "2 weeks ago"') return result
def date_parse(string_value, **_): extra_information = '' try: return datetime.strptime(string_value, date_iso_format).date() except ValueError as e: if 'out of range' in str(e) or 'unconverted data remains' in str(e): extra_information = ' (out of range)' result = parse_relative_datetime(string_value) if result is None: formats = ', '.join('"%s"' % x for x in datetime_iso_formats) raise ValidationError(f'Time data "{string_value}" does not match any of the formats "now", {formats}, and is not a relative date like "2d" or "2 weeks ago"{extra_information}') return result.date()
def test_parse_relative_datetime(): assert parse_relative_datetime('now') == datetime.now()
def test_parse_relative_date_error_condition_no_match(): assert parse_relative_date('foo') is None assert parse_relative_datetime('foo') is None