Source code for dcar.validate
"""Validation functions.
The ``is_valid_*`` functions return ``True`` if the argument is valid,
otherwise ``False``.
The ``validate_*`` functions raise a :class:`~dcar.ValidationError` if
validation failed or else return the argument unchanged.
"""
# flake8: noqa
import re
import string
from .const import MAX_NAME_LEN, LOCAL_PATH, LOCAL_INTERFACE
from .errors import ValidationError, SignatureError
from .signature import Signature
_INVALID_CHARS_RE = re.compile('[^a-zA-Z0-9_]')
_INVALID_CHARS_BUS_RE = re.compile(r'[^a-zA-Z0-9_-]')
__all__ = [
'is_valid_bus_name',
'is_valid_error_name',
'is_valid_interface_name',
'is_valid_member_name',
'is_valid_object_path',
'is_valid_serial',
'is_valid_signature',
'is_valid_unixfds_field',
'validate_bus_name',
'validate_error_name',
'validate_interface_name',
'validate_member_name',
'validate_object_path',
'validate_serial',
'validate_signature',
'validate_unixfds_field',
]
[docs]def is_valid_object_path(s):
if not isinstance(s, str) or not s.startswith('/'):
return False
if s == LOCAL_PATH:
return False
if s == '/':
return True
if s.endswith('/'):
return False
for elem in s[1:].split('/'):
if not elem or _INVALID_CHARS_RE.search(elem):
return False
return True
[docs]def is_valid_signature(s):
try:
Signature(s)
return True
except SignatureError:
return False
def _is_valid_name(s):
return 0 < len(s) <= MAX_NAME_LEN and isinstance(s, str)
[docs]def is_valid_interface_name(s):
if not _is_valid_name(s):
return False
if s == LOCAL_INTERFACE:
return False
elems = s.split('.')
if len(elems) < 2:
return False
for elem in elems:
if (not elem or elem[0] in string.digits or
_INVALID_CHARS_RE.search(elem)):
return False
return True
[docs]def is_valid_bus_name(s, unique=False, strict=True):
if unique and not s.startswith(':'):
return False
if not _is_valid_name(s):
return False
if s.startswith(':'):
unique = True
s = s[1:]
else:
unique = False
elems = s.split('.')
if not elems[0] or strict and len(elems) < 2:
return False
for elem in elems:
if (not elem or (not unique and elem[0] in string.digits) or
_INVALID_CHARS_BUS_RE.search(elem)):
return False
return True
[docs]def is_valid_member_name(s):
if (not _is_valid_name(s) or '.' in s or s[0] in string.digits or
_INVALID_CHARS_RE.search(s)):
return False
return True
[docs]def is_valid_error_name(s):
return is_valid_interface_name(s)
[docs]def is_valid_serial(i):
return isinstance(i, int) and i > 0
[docs]def is_valid_unixfds_field(i):
return isinstance(i, int) and i >= 0
[docs]def validate_object_path(s):
if not is_valid_object_path(s):
raise ValidationError('not a valid object path: %r' % s)
return s
[docs]def validate_signature(s):
try:
Signature(s)
except SignatureError as ex:
raise ValidationError('not a valid signature: %r' % s) from ex
return s
[docs]def validate_interface_name(s):
if not is_valid_interface_name(s):
raise ValidationError('not a valid interface name: %r' % s)
return s
[docs]def validate_bus_name(s, unique=False, strict=True):
if not is_valid_bus_name(s, unique, strict):
if unique:
raise ValidationError('not a valid unique name: %r' % s)
else:
raise ValidationError('not a valid bus name: %r' % s)
return s
[docs]def validate_member_name(s):
if not is_valid_member_name(s):
raise ValidationError('not a valid member name: %r' % s)
return s
[docs]def validate_error_name(s):
if not is_valid_error_name(s):
raise ValidationError('not a valid error name: %r' % s)
return s
[docs]def validate_serial(i):
if not is_valid_serial(i):
raise ValidationError('serial must be an int > 0 not %r' % i)
[docs]def validate_unixfds_field(i):
if not is_valid_unixfds_field(i):
raise ValidationError('UNIX_FDS field must be an int >= 0 not %r' % i)