Source code for notifiers.utils.schema.formats

import email
import re
from datetime import datetime

import jsonschema

from notifiers.utils.helpers import valid_file

# Taken from https://gist.github.com/codehack/6350492822e52b7fa7fe
ISO8601 = re.compile(
    r"^(?P<full>("
    r"(?P<year>\d{4})([/-]?"
    r"(?P<mon>(0[1-9])|(1[012]))([/-]?"
    r"(?P<mday>(0[1-9])|([12]\d)|(3[01])))?)?(?:T"
    r"(?P<hour>([01][0-9])|(?:2[0123]))(:?"
    r"(?P<min>[0-5][0-9])(:?"
    r"(?P<sec>[0-5][0-9]([,.]\d{1,10})?))?)?"
    r"(?:Z|([\-+](?:([01][0-9])|(?:2[0123]))(:?(?:[0-5][0-9]))?))?)?))$"
)
E164 = re.compile(r"^\+?[1-9]\d{1,14}$")
format_checker = jsonschema.FormatChecker()


[docs]@format_checker.checks("iso8601", raises=ValueError) def is_iso8601(instance: str): """Validates ISO8601 format""" if not isinstance(instance, str): return True return ISO8601.match(instance) is not None
[docs]@format_checker.checks("rfc2822", raises=ValueError) def is_rfc2822(instance: str): """Validates RFC2822 format""" if not isinstance(instance, str): return True return email.utils.parsedate(instance) is not None
[docs]@format_checker.checks("ascii", raises=ValueError) def is_ascii(instance: str): """Validates data is ASCII encodable""" if not isinstance(instance, str): return True return instance.encode("ascii")
[docs]@format_checker.checks("valid_file", raises=ValueError) def is_valid_file(instance: str): """Validates data is a valid file""" if not isinstance(instance, str): return True return valid_file(instance)
[docs]@format_checker.checks("port", raises=ValueError) def is_valid_port(instance: int): """Validates data is a valid port""" if not isinstance(instance, (int, str)): return True return int(instance) in range(65535)
[docs]@format_checker.checks("timestamp", raises=ValueError) def is_timestamp(instance): """Validates data is a timestamp""" if not isinstance(instance, (int, str)): return True return datetime.fromtimestamp(int(instance))
[docs]@format_checker.checks("e164", raises=ValueError) def is_e164(instance): """Validates data is E.164 format""" if not isinstance(instance, str): return True return E164.match(instance) is not None