69ee73b176acb6870435d90463a10ef9e8c48693
[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_number(attribute, value):
17     return isinstance(value, (float,int,long))
18
19 def is_integer(attribute, value, min=None, max=None):
20     if not isinstance(value, int):
21         return False
22     if min is not None and value < min:
23         return False
24     if max is not None and value > max:
25         return False
26     return True
27
28 def is_integer_range(min=None, max=None):
29     def is_integer_range(attribute, value):
30         if not isinstance(value, int):
31             return False
32         if min is not None and value < min:
33             return False
34         if max is not None and value > max:
35             return False
36         return True
37     return is_integer_range
38
39 def is_number_range(min=None, max=None):
40     def is_number_range(attribute, value):
41         if not isinstance(value, (float,int,long)):
42             return False
43         if min is not None and value < min:
44             return False
45         if max is not None and value > max:
46             return False
47         return True
48     return is_number_range
49
50
51 def is_string(attribute, value):
52     return isinstance(value, str)
53
54 def is_time(attribute, value):
55     return isinstance(value, str) # TODO: Missing validation!
56
57 def is_ip4_address(attribute, value):
58     try:
59         ipaddr.IPv4Address(value)
60     except ipaddr.AddressValueError:
61         return False
62     return True
63
64 def is_ip6_address(attribute, value):
65     try:
66         ipaddr.IPv6Address(value)
67     except ipaddr.AddressValueError:
68         return False
69     return True
70
71 def is_ip_address(attribute, value):
72     if not is_ip4_address(attribute, value) and \
73             not is_ip6_address(attribute, value):
74         return False
75     return True
76
77 # TODO: Allow netrefs!
78 def is_ref_address(attribute, value):
79     if not is_ip4_address(attribute, value) and \
80             not is_ip6_address(attribute, value):
81         return False
82     return True
83
84 def is_mac_address(attribute, value):
85     regex = r'^([0-9a-zA-Z]{0,2}:)*[0-9a-zA-Z]{0,2}'
86     found = re.search(regex, value)
87     if not found or value.count(':') != 5:
88         return False
89     return True
90