"""
Module containing extensions to validate data with
`voluptuous <https://github.com/alecthomas/voluptuous>`_.
"""
import functools, re
import voluptuous
from . import module, validation
_all = module.All(globals())
# Errors
[docs]class PasswordInvalid(voluptuous.Invalid):
"""Incorrect password"""
[docs]class VersionInvalid(voluptuous.Invalid):
"""Incorrect version number"""
# Validators
[docs]@voluptuous.message('Incorrect e-mail address')
def Email(value): # pylint:disable=invalid-name
value = str(value)
if not validation.valid_email(value):
raise ValueError
return value
[docs]@voluptuous.message('Incorrect list of e-mail addresses')
def EmailSet(values): # pylint:disable=invalid-name
emails = set()
for value in values or []:
email = str(value)
if not validation.valid_email(email):
raise ValueError
emails.add(email)
return emails
[docs]@voluptuous.message('Incorrect git commit hash')
def GitCommitHash(value): # pylint:disable=invalid-name
if re.match(r'^[0-9a-f]{40}$', value):
return value
raise ValueError
[docs]def Password(length=16, msg=None): # pylint:disable=invalid-name
@functools.wraps(Password)
def f(value):
value = str(value)
if len(value) < length:
raise PasswordInvalid(msg or 'Incorrect password')
return f
[docs]@voluptuous.message('Incorrect percentage')
def Percent(value): # pylint:disable=invalid-name
return voluptuous.Range(min=1, max=100)(value)
[docs]@voluptuous.message('Incorrect SHA-256 checksum')
def SHA256(value): # pylint:disable=invalid-name
if re.match(r'^[0-9a-f]{64}$', value):
return value
raise ValueError
[docs]def Version(digits=4, msg=None): # pylint:disable=invalid-name
assert 1 <= digits <= 4
pattern = r'^[0-9]+(\.[0-9]+){%d}\.[a-z0-9]+$'
@functools.wraps(Version)
def f(value):
if re.match(pattern % (digits - 2), value): # pylint:disable=consider-using-f-string
return value
raise VersionInvalid(msg or 'Incorrect version number')
return f
__all__ = _all.diff(globals())