Added new exceptions.
Refactored a couple of lines to something more palatable.
This commit is contained in:
@@ -13,18 +13,28 @@ class NotValid(Exception):
|
|||||||
class OutsideCardinality(Exception):
|
class OutsideCardinality(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class MustValueError(ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class ShouldValueError(ValueError):
|
||||||
|
pass
|
||||||
|
|
||||||
# --------------------- validators -------------------------------------
|
# --------------------- validators -------------------------------------
|
||||||
#
|
#
|
||||||
|
|
||||||
|
NCNAME = re.compile("(?P<NCName>[a-zA-Z_](\w|[_.-])*)")
|
||||||
|
|
||||||
def valid_ncname(name):
|
def valid_ncname(name):
|
||||||
exp = re.compile("(?P<NCName>[a-zA-Z_](\w|[_.-])*)")
|
match = NCNAME.match(name)
|
||||||
match = exp.match(name)
|
|
||||||
if not match:
|
if not match:
|
||||||
raise NotValid("NCName")
|
raise NotValid("NCName")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def valid_id(oid):
|
def valid_id(oid):
|
||||||
valid_ncname(oid)
|
valid_ncname(oid)
|
||||||
|
|
||||||
|
|
||||||
def valid_any_uri(item):
|
def valid_any_uri(item):
|
||||||
"""very simplistic, ..."""
|
"""very simplistic, ..."""
|
||||||
try:
|
try:
|
||||||
@@ -283,7 +293,7 @@ def valid(typ, value):
|
|||||||
|
|
||||||
def _valid_instance(instance, val):
|
def _valid_instance(instance, val):
|
||||||
try:
|
try:
|
||||||
valid_instance(val)
|
val.verify()
|
||||||
except NotValid, exc:
|
except NotValid, exc:
|
||||||
raise NotValid("Class '%s' instance: %s" % \
|
raise NotValid("Class '%s' instance: %s" % \
|
||||||
(instance.__class__.__name__,
|
(instance.__class__.__name__,
|
||||||
@@ -298,7 +308,7 @@ ERROR_TEXT = "Wrong type of value '%s' on attribute '%s' expected it to be %s"
|
|||||||
def valid_instance(instance):
|
def valid_instance(instance):
|
||||||
instclass = instance.__class__
|
instclass = instance.__class__
|
||||||
class_name = instclass.__name__
|
class_name = instclass.__name__
|
||||||
try:
|
|
||||||
if instclass.c_value_type and instance.text:
|
if instclass.c_value_type and instance.text:
|
||||||
try:
|
try:
|
||||||
validate_value_type(instance.text.strip(),
|
validate_value_type(instance.text.strip(),
|
||||||
@@ -306,14 +316,12 @@ def valid_instance(instance):
|
|||||||
except NotValid, exc:
|
except NotValid, exc:
|
||||||
raise NotValid("Class '%s' instance: %s" % (class_name,
|
raise NotValid("Class '%s' instance: %s" % (class_name,
|
||||||
exc.args[0]))
|
exc.args[0]))
|
||||||
except AttributeError: # No c_value_type
|
|
||||||
pass
|
|
||||||
|
|
||||||
for (name, typ, required) in instclass.c_attributes.values():
|
for (name, typ, required) in instclass.c_attributes.values():
|
||||||
value = getattr(instance, name, '')
|
value = getattr(instance, name, '')
|
||||||
if required and not value:
|
if required and not value:
|
||||||
txt = "Required value on property '%s' missing" % name
|
txt = "Required value on property '%s' missing" % name
|
||||||
raise NotValid("Class '%s' instance: %s" % (class_name, txt))
|
raise MustValueError("Class '%s' instance: %s" % (class_name, txt))
|
||||||
|
|
||||||
if value:
|
if value:
|
||||||
try:
|
try:
|
||||||
@@ -326,7 +334,7 @@ def valid_instance(instance):
|
|||||||
validate_value_type(value, spec)
|
validate_value_type(value, spec)
|
||||||
else:
|
else:
|
||||||
valid(typ, value)
|
valid(typ, value)
|
||||||
except NotValid, exc:
|
except (NotValid, ValueError), exc:
|
||||||
txt = ERROR_TEXT % (value, name, exc.args[0])
|
txt = ERROR_TEXT % (value, name, exc.args[0])
|
||||||
raise NotValid(
|
raise NotValid(
|
||||||
"Class '%s' instance: %s" % (class_name, txt))
|
"Class '%s' instance: %s" % (class_name, txt))
|
||||||
@@ -334,42 +342,56 @@ def valid_instance(instance):
|
|||||||
for (name, _spec) in instclass.c_children.values():
|
for (name, _spec) in instclass.c_children.values():
|
||||||
value = getattr(instance, name, '')
|
value = getattr(instance, name, '')
|
||||||
|
|
||||||
if value:
|
|
||||||
if name in instclass.c_cardinality:
|
|
||||||
try:
|
try:
|
||||||
|
_card = instclass.c_cardinality[name]
|
||||||
|
try:
|
||||||
|
_cmin = _card["min"]
|
||||||
|
except KeyError:
|
||||||
|
_cmin = None
|
||||||
|
try:
|
||||||
|
_cmax = _card["max"]
|
||||||
|
except KeyError:
|
||||||
|
_cmax = None
|
||||||
|
except KeyError:
|
||||||
|
_cmin = _cmax = _card = None
|
||||||
|
|
||||||
|
if value:
|
||||||
|
if isinstance(value, list):
|
||||||
|
_list = True
|
||||||
vlen = len(value)
|
vlen = len(value)
|
||||||
except TypeError:
|
else:
|
||||||
|
_list = False
|
||||||
vlen = 1
|
vlen = 1
|
||||||
|
|
||||||
if "min" in instclass.c_cardinality[name] and \
|
if _card:
|
||||||
instclass.c_cardinality[name]["min"] > vlen:
|
if _cmin is not None and _cmin > vlen:
|
||||||
raise NotValid(
|
raise NotValid(
|
||||||
"Class '%s' instance cardinality error: %s" % \
|
"Class '%s' instance cardinality error: %s" % \
|
||||||
(class_name, "less then min (%s<%s)" % \
|
(class_name, "less then min (%s<%s)" % (vlen,
|
||||||
(vlen, instclass.c_cardinality[name]["min"])))
|
_cmin)))
|
||||||
if "max" in instclass.c_cardinality[name] and \
|
if _cmax is not None and vlen > _cmax:
|
||||||
instclass.c_cardinality[name]["max"] < vlen:
|
|
||||||
raise NotValid(
|
raise NotValid(
|
||||||
"Class '%s' instance cardinality error: %s" % \
|
"Class '%s' instance cardinality error: %s" % \
|
||||||
(class_name, "more then max (%s>%s)" % \
|
(class_name, "more then max (%s>%s)" % (vlen,
|
||||||
(vlen, instclass.c_cardinality[name]["max"])))
|
_cmax)))
|
||||||
|
|
||||||
if isinstance(value, list):
|
if _list:
|
||||||
for val in value:
|
for val in value:
|
||||||
# That it is the right class is handled elsewhere
|
# That it is the right class is handled elsewhere
|
||||||
_valid_instance(instance, val)
|
_valid_instance(instance, val)
|
||||||
else:
|
else:
|
||||||
_valid_instance(instance, value)
|
_valid_instance(instance, value)
|
||||||
else:
|
else:
|
||||||
try:
|
if _cmin:
|
||||||
min = instclass.c_cardinality[name]["min"]
|
|
||||||
if min:
|
|
||||||
print >> sys.stderr, \
|
|
||||||
"Min cardinality for '%s': %s" % (name, min)
|
|
||||||
raise NotValid(
|
raise NotValid(
|
||||||
"Class '%s' instance cardinality error: %s" % \
|
"Class '%s' instance cardinality error: %s" % \
|
||||||
(class_name, "too few values on %s" % name))
|
(class_name, "too few values on %s" % name))
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def valid_domain_name(dns_name):
|
||||||
|
m = re.match(
|
||||||
|
"^[a-z0-9]+([-.]{1}[a-z0-9]+).[a-z]{2,5}(:[0-9]{1,5})?(\/.)?$",
|
||||||
|
dns_name, "ix")
|
||||||
|
if not m:
|
||||||
|
raise ValueError("Not a proper domain name")
|
||||||
Reference in New Issue
Block a user