- Merge with head
[nepi.git] / src / nepi / util / validation.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 import ipaddr
5 import re
6
7 def is_enum(attribute, value):
8     return isinstance(value, str) and value in attribute.allowed
9
10 def is_bool(attribute, value):
11     return isinstance(value, bool)
12
13 def is_double(attribute, value):
14     return isinstance(value, float)
15
16 def is_integer(attribute, value, min=None, max=None):
17     if not isinstance(value, int):
18         return False
19     if min is not None and value < min:
20         return False
21     if max is not None and value > max:
22         return False
23     return True
24
25 def is_integer_range(min=None, max=None):
26     def is_integer_range(attribute, value):
27         if not isinstance(value, int):
28             return False
29         if min is not None and value < min:
30             return False
31         if max is not None and value > max:
32             return False
33         return True
34     return is_integer_range
35
36
37 def is_string(attribute, value):
38     return isinstance(value, str)
39
40 def is_time(attribute, value):
41     return isinstance(value, str) # TODO: Missing validation!
42
43 def is_ip4_address(attribute, value):
44     try:
45         ipaddr.IPv4Address(value)
46     except ipaddr.AddressValueError:
47         return False
48     return True
49
50 def is_ip6_address(attribute, value):
51     try:
52         ipaddr.IPv6Address(value)
53     except ipaddr.AddressValueError:
54         return False
55     return True
56
57 # TODO: Allow netrefs!
58 def is_ip_address(attribute, value):
59     if not is_ip4_address(attribute, value) and \
60             not is_ip6_address(attribute, value):
61         return False
62     return True
63
64 def is_mac_address(attribute, value):
65     regex = r'^([0-9a-zA-Z]{0,2}:)*[0-9a-zA-Z]{0,2}'
66     found = re.search(regex, value)
67     if not found or value.count(':') != 5:
68         return False
69     return True
70