Package elisa :: Package extern :: Module validate
[hide private]
[frames] | no frames]

Module validate

source code

The Validator object is used to check that supplied values conform to a specification.

The value can be supplied as a string - e.g. from a config file. In this case the check will also convert the value to the required type. This allows you to add validation as a transparent layer to access data stored as strings. The validation checks that the data is correct and converts it to the expected type.

Some standard checks are provided for basic data types. Additional checks are easy to write. They can be provided when the Validator is instantiated or added afterwards.

The standard functions work with the following basic data types :

plus lists of these datatypes

Adding additional checks is done through coding simple functions.

The full set of standard checks are :

You can supply a default value (returned if no value is supplied) using the default keyword argument.

You specify a list argument for default using a list constructor syntax in the check :

checkname(arg1, arg2, default=list('val 1', 'val 2', 'val 3'))

A badly formatted set of arguments will raise a VdtParamError.




Version: 0.2.3

Classes [hide private]
  ValidateError
This error indicates that the check failed.
  VdtMissingValue
No value was supplied to a check that needed one.
  VdtUnknownCheckError
An unknown check function was requested
  VdtParamError
An incorrect parameter was passed
  VdtTypeError
The value supplied was of the wrong type
  VdtValueError
The value supplied was of the correct type, but was not an allowed value.
  VdtValueTooSmallError
The value supplied was of the correct type, but was too small.
  VdtValueTooBigError
The value supplied was of the correct type, but was too big.
  VdtValueTooShortError
The value supplied was of the correct type, but was too short.
  VdtValueTooLongError
The value supplied was of the correct type, but was too long.
  Validator
Validator is an object that allows you to register a set of 'checks'.
Functions [hide private]
 
bool(val)
Simple boolean equivalent function.
source code
 
dottedQuadToNum(ip)
Convert decimal dotted quad string to long integer
source code
 
numToDottedQuad(num)
Convert long int to dotted quad string
source code
 
_is_num_param(names, values, to_float=True)
Return numbers from inputs or raise VdtParamError.
source code
 
is_integer(value, min='frontend', max='frontend')
A check that tests that a given value is an integer (int, or long) and optionally, between bounds.
source code
 
is_float(value, min='frontend', max='frontend')
A check that tests that a given value is a float (an integer will be accepted), and optionally - that it is between bounds.
source code
 
is_boolean(value)
Check if the value represents a boolean.
source code
 
is_ip_addr(value)
Check that the supplied value is an Internet Protocol address, v.4, represented by a dotted-quad string, i.e.
source code
 
is_list(value, min='frontend', max='frontend')
Check that the value is a list of values.
source code
 
is_string(value, min='frontend', max='frontend')
Check that the supplied value is a string.
source code
 
is_int_list(value, min='frontend', max='frontend')
Check that the value is a list of integers.
source code
 
is_bool_list(value, min='frontend', max='frontend')
Check that the value is a list of booleans.
source code
 
is_float_list(value, min='frontend', max='frontend')
Check that the value is a list of floats.
source code
 
is_string_list(value, min='frontend', max='frontend')
Check that the value is a list of strings.
source code
 
is_ip_addr_list(value, min='frontend', max='frontend')
Check that the value is a list of IP addresses.
source code
 
is_mixed_list(value, *args)
Check that the value is a list.
source code
 
is_option(value, *options)
This check matches the value to any of a set of options.
source code
 
_test(value, *args, **keywargs)
A function that exists for test purposes.
source code
Variables [hide private]
  __revision__ = '$Id: validate.py 123 2005-09-08 08:54:28Z fuzz...
  INTP_VER = (2, 5)
  StringTypes = (<type 'str'>, <type 'unicode'>)
  _list_arg = re.compile(r'(?x)(?:([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s...
  _list_members = re.compile(r'(?x)((?:".*?")|(?:\'.*?\')|(?:[^\...
  _paramstring = '\n (?:\n (\n (?:\n ...
  _matchstring = '^\n (?:\n (\n (?:\n ...
  bool_dict = {False: False, True: True, '0': False, '1': True, ...
  fun_dict = {'integer': is_integer, 'float': is_float, 'ip_addr...
Function Details [hide private]

_is_num_param(names, values, to_float=True)

source code 

Return numbers from inputs or raise VdtParamError.

Lets None pass through. Pass in keyword argument to_float=True to use float for the conversion rather than int.

>>> _is_num_param(('', ''), (0, 1.0))
[0, 1]
>>> _is_num_param(('', ''), (0, 1.0), to_float=True)
[0.0, 1.0]
>>> _is_num_param(('a'), ('a'))
Traceback (most recent call last):
VdtParamError: passed an incorrect value "a" for parameter "a".

is_integer(value, min='frontend', max='frontend')

source code 

A check that tests that a given value is an integer (int, or long) and optionally, between bounds. A negative value is accepted, while a float will fail.

If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised.

>>> vtor.check('integer', '-1')
-1
>>> vtor.check('integer', '0')
0
>>> vtor.check('integer', 9)
9
>>> vtor.check('integer', 'a')
Traceback (most recent call last):
VdtTypeError: the value "a" is of the wrong type.
>>> vtor.check('integer', '2.2')
Traceback (most recent call last):
VdtTypeError: the value "2.2" is of the wrong type.
>>> vtor.check('integer(10)', '20')
20
>>> vtor.check('integer(max=20)', '15')
15
>>> vtor.check('integer(10)', '9')
Traceback (most recent call last):
VdtValueTooSmallError: the value "9" is too small.
>>> vtor.check('integer(10)', 9)
Traceback (most recent call last):
VdtValueTooSmallError: the value "9" is too small.
>>> vtor.check('integer(max=20)', '35')
Traceback (most recent call last):
VdtValueTooBigError: the value "35" is too big.
>>> vtor.check('integer(max=20)', 35)
Traceback (most recent call last):
VdtValueTooBigError: the value "35" is too big.
>>> vtor.check('integer(0, 9)', False)
0

is_float(value, min='frontend', max='frontend')

source code 

A check that tests that a given value is a float (an integer will be accepted), and optionally - that it is between bounds.

If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised.

This can accept negative values.

>>> vtor.check('float', '2')
2.0

From now on we multiply the value to avoid comparing decimals

>>> vtor.check('float', '-6.8') * 10
-68.0
>>> vtor.check('float', '12.2') * 10
122.0
>>> vtor.check('float', 8.4) * 10
84.0
>>> vtor.check('float', 'a')
Traceback (most recent call last):
VdtTypeError: the value "a" is of the wrong type.
>>> vtor.check('float(10.1)', '10.2') * 10
102.0
>>> vtor.check('float(max=20.2)', '15.1') * 10
151.0
>>> vtor.check('float(10.0)', '9.0')
Traceback (most recent call last):
VdtValueTooSmallError: the value "9.0" is too small.
>>> vtor.check('float(max=20.0)', '35.0')
Traceback (most recent call last):
VdtValueTooBigError: the value "35.0" is too big.

is_ip_addr(value)

source code 

Check that the supplied value is an Internet Protocol address, v.4, represented by a dotted-quad string, i.e. '1.2.3.4'.

>>> vtor.check('ip_addr', '1 ')
'1'
>>> vtor.check('ip_addr', ' 1.2')
'1.2'
>>> vtor.check('ip_addr', ' 1.2.3 ')
'1.2.3'
>>> vtor.check('ip_addr', '1.2.3.4')
'1.2.3.4'
>>> vtor.check('ip_addr', '0.0.0.0')
'0.0.0.0'
>>> vtor.check('ip_addr', '255.255.255.255')
'255.255.255.255'
>>> vtor.check('ip_addr', '255.255.255.256')
Traceback (most recent call last):
VdtValueError: the value "255.255.255.256" is unacceptable.
>>> vtor.check('ip_addr', '1.2.3.4.5')
Traceback (most recent call last):
VdtValueError: the value "1.2.3.4.5" is unacceptable.
>>> vtor.check('ip_addr', '1.2.3. 4')
Traceback (most recent call last):
VdtValueError: the value "1.2.3. 4" is unacceptable.
>>> vtor.check('ip_addr', 0)
Traceback (most recent call last):
VdtTypeError: the value "0" is of the wrong type.

is_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of values.

You can optionally specify the minimum and maximum number of members.

It does no check on list members.

>>> vtor.check('list', ())
()
>>> vtor.check('list', [])
[]
>>> vtor.check('list', (1, 2))
(1, 2)
>>> vtor.check('list', [1, 2])
[1, 2]
>>> vtor.check('list', '12')
'12'
>>> vtor.check('list(3)', (1, 2))
Traceback (most recent call last):
VdtValueTooShortError: the value "(1, 2)" is too short.
>>> vtor.check('list(max=5)', (1, 2, 3, 4, 5, 6))
Traceback (most recent call last):
VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long.
>>> vtor.check('list(min=3, max=5)', (1, 2, 3, 4))
(1, 2, 3, 4)
>>> vtor.check('list', 0)
Traceback (most recent call last):
VdtTypeError: the value "0" is of the wrong type.

is_string(value, min='frontend', max='frontend')

source code 

Check that the supplied value is a string.

You can optionally specify the minimum and maximum number of members.

>>> vtor.check('string', '0')
'0'
>>> vtor.check('string', 0)
Traceback (most recent call last):
VdtTypeError: the value "0" is of the wrong type.
>>> vtor.check('string(2)', '12')
'12'
>>> vtor.check('string(2)', '1')
Traceback (most recent call last):
VdtValueTooShortError: the value "1" is too short.
>>> vtor.check('string(min=2, max=3)', '123')
'123'
>>> vtor.check('string(min=2, max=3)', '1234')
Traceback (most recent call last):
VdtValueTooLongError: the value "1234" is too long.

is_int_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of integers.

You can optionally specify the minimum and maximum number of members.

Each list member is checked that it is an integer.

>>> vtor.check('int_list', ())
[]
>>> vtor.check('int_list', [])
[]
>>> vtor.check('int_list', (1, 2))
[1, 2]
>>> vtor.check('int_list', [1, 2])
[1, 2]
>>> vtor.check('int_list', [1, 'a'])
Traceback (most recent call last):
VdtTypeError: the value "a" is of the wrong type.

is_bool_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of booleans.

You can optionally specify the minimum and maximum number of members.

Each list member is checked that it is a boolean.

>>> vtor.check('bool_list', ())
[]
>>> vtor.check('bool_list', [])
[]
>>> check_res = vtor.check('bool_list', (True, False))
>>> check_res == [True, False]
1
>>> check_res = vtor.check('bool_list', [True, False])
>>> check_res == [True, False]
1
>>> vtor.check('bool_list', [True, 'a'])
Traceback (most recent call last):
VdtTypeError: the value "a" is of the wrong type.

is_float_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of floats.

You can optionally specify the minimum and maximum number of members.

Each list member is checked that it is a float.

>>> vtor.check('float_list', ())
[]
>>> vtor.check('float_list', [])
[]
>>> vtor.check('float_list', (1, 2.0))
[1.0, 2.0]
>>> vtor.check('float_list', [1, 2.0])
[1.0, 2.0]
>>> vtor.check('float_list', [1, 'a'])
Traceback (most recent call last):
VdtTypeError: the value "a" is of the wrong type.

is_string_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of strings.

You can optionally specify the minimum and maximum number of members.

Each list member is checked that it is a string.

>>> vtor.check('string_list', ())
[]
>>> vtor.check('string_list', [])
[]
>>> vtor.check('string_list', ('a', 'b'))
['a', 'b']
>>> vtor.check('string_list', ['a', 1])
Traceback (most recent call last):
VdtTypeError: the value "1" is of the wrong type.
>>> vtor.check('string_list', 'hello')
Traceback (most recent call last):
VdtTypeError: the value "hello" is of the wrong type.

is_ip_addr_list(value, min='frontend', max='frontend')

source code 

Check that the value is a list of IP addresses.

You can optionally specify the minimum and maximum number of members.

Each list member is checked that it is an IP address.

>>> vtor.check('ip_addr_list', ())
[]
>>> vtor.check('ip_addr_list', [])
[]
>>> vtor.check('ip_addr_list', ('1.2.3.4', '5.6.7.8'))
['1.2.3.4', '5.6.7.8']
>>> vtor.check('ip_addr_list', ['a'])
Traceback (most recent call last):
VdtValueError: the value "a" is unacceptable.

is_mixed_list(value, *args)

source code 

Check that the value is a list. Allow specifying the type of each member. Work on lists of specific lengths.

You specify each member as a positional argument specifying type

Each type should be one of the following strings :
'integer', 'float', 'ip_addr', 'string', 'boolean'

So you can specify a list of two strings, followed by two integers as :

mixed_list('string', 'string', 'integer', 'integer')

The length of the list must match the number of positional arguments you supply.

>>> mix_str = "mixed_list('integer', 'float', 'ip_addr', 'string', 'boolean')"
>>> check_res = vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', True))
>>> check_res == [1, 2.0, '1.2.3.4', 'a', True]
1
>>> check_res = vtor.check(mix_str, ('1', '2.0', '1.2.3.4', 'a', 'True'))
>>> check_res == [1, 2.0, '1.2.3.4', 'a', True]
1
>>> vtor.check(mix_str, ('b', 2.0, '1.2.3.4', 'a', True))
Traceback (most recent call last):
VdtTypeError: the value "b" is of the wrong type.
>>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a'))
Traceback (most recent call last):
VdtValueTooShortError: the value "(1, 2.0, '1.2.3.4', 'a')" is too short.
>>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', 1, 'b'))
Traceback (most recent call last):
VdtValueTooLongError: the value "(1, 2.0, '1.2.3.4', 'a', 1, 'b')" is too long.
>>> vtor.check(mix_str, 0)
Traceback (most recent call last):
VdtTypeError: the value "0" is of the wrong type.

This test requires an elaborate setup, because of a change in error string output from the interpreter between Python 2.2 and 2.3 .

>>> res_seq = (
...     'passed an incorrect value "',
...     'yoda',
...     '" for parameter "mixed_list".',
... )
>>> if INTP_VER == (2, 2):
...     res_str = "".join(res_seq)
... else:
...     res_str = "'".join(res_seq)
>>> try:
...     vtor.check('mixed_list("yoda")', ('a'))
... except VdtParamError, err:
...     str(err) == res_str
1

Variables Details [hide private]

__revision__

Value:
'$Id: validate.py 123 2005-09-08 08:54:28Z fuzzyman $'

_list_arg

Value:
re.compile(r'(?x)(?:([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*list\(((?:\s*(?:(?:\
".*?")|(?:\'.*?\')|(?:[^\'",\s\)][^,\)]*?))\s*,\s*)*(?:(?:".*?")|(?:\'\
.*?\')|(?:[^\'",\s\)][^,\)]*?))?)\))')

_list_members

Value:
re.compile(r'(?x)((?:".*?")|(?:\'.*?\')|(?:[^\'",\s=][^,=]*?))(?:(?:\s\
*,\s*)|(?:\s*$))')

_paramstring

Value:
'''
    (?:
        (
            (?:
                [a-zA-Z_][a-zA-Z0-9_]*\\s*=\\s*list\\(
                    (?:
                        \\s*
                        (?:
...

_matchstring

Value:
'''^
    (?:
        (
            (?:
                [a-zA-Z_][a-zA-Z0-9_]*\\s*=\\s*list\\(
                    (?:
                        \\s*
                        (?:
...

bool_dict

Value:
{False: False,
 True: True,
 '0': False,
 '1': True,
 'false': False,
 'no': False,
 'off': False,
 'on': True,
...

fun_dict

Value:
{'integer': is_integer, 'float': is_float, 'ip_addr': is_ip_addr, 'str\
ing': is_string, 'boolean': is_boolean,}