summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter A. Bigot <pabigot@users.sourceforge.net>2010-05-29 22:55:57 -0500
committerPeter A. Bigot <pabigot@users.sourceforge.net>2010-05-29 22:55:57 -0500
commitbce59b079b70e65823a15946e52308b6cf70a2ff (patch)
tree9470c8dfc08c9d7a59ee7b908704be4afafd6d0a
parent43e3f10e98896c286fe8cb9fe9ab74dd07717c63 (diff)
Improve handling of namespaces in wildcard validation.
The generated code specifies namespaces by their URIs. The specification for the content.Wildcard class has them as Namespace instances. Convert them, then correct the various problems that resulted from comparing namespaces with URIs either of which might be None.
-rw-r--r--pyxb/binding/content.py27
1 files changed, 23 insertions, 4 deletions
diff --git a/pyxb/binding/content.py b/pyxb/binding/content.py
index 31da4ca..ea681dd 100644
--- a/pyxb/binding/content.py
+++ b/pyxb/binding/content.py
@@ -697,6 +697,7 @@ class ChoiceState (ContentState_mixin):
return
except Exception, e:
pass
+ #print 'Missing components %s' % ("\n".join([ "\n ".join([str(_p2.term()) for _p2 in _p.particle().term().particles()]) for _p in self.__choices ]),)
raise pyxb.MissingContentError('choice')
self.__activeChoice.verifyComplete()
@@ -969,9 +970,22 @@ class Wildcard (ContentState_mixin):
__processContents = None
def processContents (self): return self.__processContents
+ def __normalizeNamespace (self, nsv):
+ if nsv is None:
+ return None
+ if isinstance(nsv, basestring):
+ nsv = pyxb.namespace.NamespaceForURI(nsv)
+ assert isinstance(nsv, pyxb.namespace.Namespace)
+ return nsv
+
def __init__ (self, *args, **kw):
# Namespace constraint and process contents are required parameters.
- self.__namespaceConstraint = kw['namespace_constraint']
+ nsc = kw['namespace_constraint']
+ if isinstance(nsc, tuple):
+ nsc = (nsc[0], self.__normalizeNamespace(nsc[1]))
+ elif isinstance(nsc, set):
+ nsc = set([ self.__normalizeNamespace(_uri) for _uri in nsc ])
+ self.__namespaceConstraint = nsc
self.__processContents = kw['process_contents']
def matches (self, instance, value):
@@ -992,14 +1006,16 @@ class Wildcard (ContentState_mixin):
ns = value._ExpandedName.namespace()
else:
raise pyxb.LogicError('Need namespace from value')
+ if isinstance(ns, pyxb.namespace.Namespace) and ns.isAbsentNamespace():
+ ns = None
if self.NC_any == self.__namespaceConstraint:
return True
if isinstance(self.__namespaceConstraint, tuple):
(_, constrained_ns) = self.__namespaceConstraint
assert self.NC_not == _
- if constrained_ns == ns:
+ if ns is None:
return False
- if ns.isAbsentNamespace():
+ if constrained_ns == ns:
return False
return True
return ns in self.__namespaceConstraint
@@ -1008,7 +1024,10 @@ class Wildcard (ContentState_mixin):
return self
def accepts (self, particle_state, instance, value, element_use):
- value_desc = 'value of type %s' % (type(value),)
+ if isinstance(value, xml.dom.Node):
+ value_desc = 'value in %s' % (value.nodeName,)
+ else:
+ value_desc = 'value of type %s' % (type(value),)
if not self.matches(instance, value):
return False
if not isinstance(value, basis._TypeBinding_mixin):