Package pyxb :: Module exceptions_
[hide private]
[frames] | no frames]

Source Code for Module pyxb.exceptions_

  1  # Copyright 2009, Peter A. Bigot 
  2  # 
  3  # Licensed under the Apache License, Version 2.0 (the "License"); you may 
  4  # not use this file except in compliance with the License. You may obtain a 
  5  # copy of the License at: 
  6  # 
  7  #            http://www.apache.org/licenses/LICENSE-2.0 
  8  # 
  9  # Unless required by applicable law or agreed to in writing, software 
 10  # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
 11  # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
 12  # License for the specific language governing permissions and limitations 
 13  # under the License. 
 14   
 15  """Extensions of standard exceptions for PyXB events. 
 16   
 17  Yeah, I'd love this module to be named exceptions.py, but it can't 
 18  because the standard library has one of those, and we need to 
 19  reference it below. 
 20  """ 
 21   
 22  import exceptions 
23 24 -class PyXBException (exceptions.Exception):
25 """Base class for exceptions that indicate a problem that the user should fix.""" 26 27 """The arguments passed to the exception constructor.""" 28 _args = None 29 30 """The keywords passed to the exception constructor. 31 32 @note: Do not pop values from the keywords array in subclass 33 constructors that recognize and extract values from them. They 34 should be kept around so they're accessible generically.""" 35 _kw = None 36 37 @property
38 - def message (self):
39 '''A message to help a human understand the problem.''' 40 if self.__message is None: 41 return str(self) 42 return self.__message
43
44 - def __str__ (self):
45 """Override to use the system-provided message, if available.""" 46 if self.__message is not None: 47 return '%s: %s' % (type(self).__name__, self.__message) 48 return exceptions.Exception.__str__(self)
49
50 - def __init__ (self, *args, **kw):
51 """Create an exception indicating a PyXB-related problem. 52 53 @keyword message : Text to provide the user with information about the problem. 54 """ 55 self.__message = kw.get('message') 56 self._args = args 57 self._kw = kw 58 exceptions.Exception.__init__(self, *args)
59
60 -class SchemaValidationError (PyXBException):
61 """Raised when the XML hierarchy does not appear to be valid for an XML schema.""" 62 pass
63
64 -class NamespaceError (PyXBException):
65 """Violation of some rule relevant to XML Namespaces"""
66 - def __init__ (self, namespace, *args, **kw):
67 PyXBException.__init__(self, *args, **kw) 68 self.__namespace = namespace
69
70 - def namespace (self): return self.__namespace
71
72 -class NamespaceArchiveError (PyXBException):
73 """Problem related to namespace archives""" 74 pass
75
76 -class SchemaUniquenessError (PyXBException):
77 """Raised when somebody tries to create a schema component using a 78 schema that has already been used in that namespace. Import and 79 include processing would have avoided this, so somebody asked for 80 it specifically."""
81 - def __init__ (self, namespace, schema_location, existing_schema, *args, **kw):
82 # Prior to 2.5, exceptions did not inherit from object, and 83 # super could not be used. 84 #super(SchemaUniquenessError, self).__init__(*args, **kw) 85 PyXBException.__init__(self, *args, **kw) 86 self.__namespace = namespace 87 self.__schemaLocation = schema_location 88 self.__existingSchema = existing_schema
89
90 - def namespace (self): return self.__namespace
91 - def schemaLocation (self): return self.__schemaLocation
92 - def existingSchema (self): return self.__existingSchema
93
94 -class BindingGenerationError (PyXBException):
95 """Raised when something goes wrong generating the binding classes""" 96 pass
97
98 -class NamespaceUniquenessError (NamespaceError):
99 """Raised when an attempt is made to record multiple objects of the same name in the same namespace category.""" 100 pass
101
102 -class BadTypeValueError (PyXBException):
103 """Raised when a value in an XML attribute does not conform to the simple type.""" 104 pass
105
106 -class NotInNamespaceError (PyXBException):
107 '''Raised when a name is referenced that is not defined in the appropriate namespace.''' 108 __namespace = None 109 __ncName = None
110
111 -class BadPropertyError (PyXBException):
112 """Raised when a schema component property is accessed on a component instance that does not define that property.""" 113 pass
114
115 -class BadDocumentError (PyXBException):
116 """Raised when processing document content and an error is encountered.""" 117 pass
118
119 -class StructuralBadDocumentError (BadDocumentError):
120 """Raised when processing document and the content model is not satisfied."""
121
122 -class AbstractElementError (StructuralBadDocumentError):
123 """Raised when attempting to construct an element that is abstract.""" 124 pass
125
126 -class UnrecognizedContentError (StructuralBadDocumentError):
127 """Raised when processing document and an element does not match the content model.""" 128 129 @property
130 - def element_use (self):
131 """The L{pyxb.binding.content.ElementUse} instance to which the content should conform, if available.""" 132 return self.__elementUse
133 134 @property
135 - def container (self):
136 """The L{pyxb.binding.basis.complexTypeDefinition} instance to which the content would belong, if available.""" 137 return self.__container
138 139 @property
140 - def content (self):
141 """The value which could not be reconciled with the content model.""" 142 return self.__content
143
144 - def __init__ (self, content, **kw):
145 """Raised when processing document and an element does not match the content model. 146 147 @param content : The value that could not be reconciled with the content model 148 @keyword container : Optional binding instance into which the content was to be assigned 149 @keyword element_use : Optional reference to an element use identifying the element to which the value was to be reconciled 150 """ 151 self.__content = content 152 self.__container = kw.get('container') 153 self.__elementUse = kw.get('element_use') 154 if self.__container is not None: 155 kw.setdefault('message', '%s cannot accept wildcard content %s' % (self.__container, self.__content)) 156 elif self.__elementUse is not None: 157 kw.setdefault('message', '%s not consistent with content model for %s' % (self.__content, self.__elementUse)) 158 else: 159 kw.setdefault('message', str(self.__content)) 160 StructuralBadDocumentError.__init__(self, **kw)
161
162 -class UnrecognizedElementError (UnrecognizedContentError):
163 """Raised when creating an instance from a document with an unrecognized root element.""" 164 165 @property
166 - def element_name (self):
167 """The L{pyxb.namespace.ExpandedName} of the element that was not recognized.""" 168 return self.__elementName
169 170 @property
171 - def dom_node (self):
172 """The DOM node associated with the unrecognized element, if available.""" 173 return self.__domNode
174
175 - def __init__ (self, **kw):
176 """Raised when creating an instance from a document with an unrecognized root element. 177 178 @keyword element_name : The expanded name of the outermost element 179 @keyword dom_node : The DOM node of the outermost element, if available 180 """ 181 self.__domNode = kw.get('dom_node') 182 self.__elementName = kw.get('element_name') 183 if self.__elementName is None: 184 if self.__domNode is not None: 185 import pyxb.namespace 186 self.__elementName = pyxb.namespace.ExpandedName(self.__domNode.namespaceURI, self.__domNode.localName) 187 else: 188 raise LogicError('No source for element_name in UnrecognizedElementError') 189 kw.setdefault('message', 'No element binding available for %s' % (self.__elementName,)) 190 UnrecognizedContentError.__init__(self, self.__domNode, **kw)
191
192 -class ExtraContentError (StructuralBadDocumentError):
193 """Raised when processing document and there is more material in an element content than expected."""
194
195 -class ContentInNilElementError (ExtraContentError):
196 """Raised when an element that is marked to be nil has content.""" 197 pass
198
199 -class MissingContentError (StructuralBadDocumentError):
200 """Raised when processing document and expected content is not present. See also UnrecognizedContentError."""
201
202 -class NotAnElementError (UnrecognizedContentError):
203 """Raised when processing document and a tag that is a type but not an element is encountered.""" 204 205 @property
206 - def element_name (self):
207 """The L{pyxb.namespace.ExpandedName} of the element that was not recognized.""" 208 return self.__elementName
209 210 @property
211 - def containing_type (self):
212 """The L{pyxb.binding.content.complexTypeDefinition} in which the element was unrecognized.""" 213 return self.__containingType
214
215 - def __init__ (self, element_name, containing_type, **kw):
216 """Raised when a document inner element is recognized as a type rather than an element. 217 218 @param element_name : The name of the inner element from the document 219 @param containing_type : The L{pyxb.binding.content.complexTypeDefinition} class in which the lookup failed 220 """ 221 self.__elementName = element_name 222 self.__containingType = containing_type 223 kw.setdefault('message', 'Unable to locate element %s in type %s' % (element_name, self.__containingType._ExpandedName)) 224 UnrecognizedContentError.__init__(self, None, **kw)
225
226 -class UnrecognizedAttributeError (BadDocumentError):
227 """Raised when an attribute is found that is not sanctioned by the content model."""
228
229 -class ValidationError (PyXBException):
230 """Raised when something in the infoset fails to satisfy a content model or attribute requirement.""" 231 pass
232
233 -class AttributeValidationError (ValidationError):
234 """Raised when an attribute requirement is not satisfied.""" 235 pass
236
237 -class ProhibitedAttributeError (AttributeValidationError):
238 """Raised when an attribute that is prohibited is provided in an element."""
239
240 -class MissingAttributeError (AttributeValidationError):
241 """Raised when an attribute that is required is missing in an element."""
242
243 -class AttributeChangeError (BadDocumentError):
244 """Raised when an attribute with a fixed value constraint is set to a different value."""
245
246 -class AbstractInstantiationError (PyXBException):
247 """Raised when somebody tries to instantiate an abstract complex type."""
248
249 -class DOMGenerationError (PyXBException):
250 """Raised when converting binding to DOM and something goes wrong.""" 251 pass
252
253 -class NoNillableSupportError (PyXBException):
254 """Raised when checking _isNil on a type that does not support nillable.""" 255 pass
256
257 -class BindingValidationError (ValidationError):
258 """Raised when the content of a binding object is not consistent with its content model""" 259 pass
260
261 -class UnexpectedNonElementContentError (ValidationError):
262 """Raised when an element is given non-element content but may not contain such.""" 263 pass
264
265 -class NoContentModel (BindingValidationError):
266 """Raised when an operation is attempted that requires a content 267 model, but the complex type has empty or simple content.""" 268 pass
269
270 -class BindingError (PyXBException):
271 """Raised when the bindings are mis-used.""" 272 pass
273
274 -class NotSimpleContentError (BindingError):
275 """Raised when an operation that requires simple content is 276 invoked on a complex type that does not have simple content.""" 277 pass
278
279 -class NotComplexContentError (BindingError):
280 """Raised when an operation is attempted that requires a content 281 model, but the complex type has empty or simple content.""" 282 pass
283
284 -class PyXBError (exceptions.Exception):
285 """Base class for exceptions that indicate a problem that the user probably can't fix.""" 286 pass
287
288 -class UsageError (PyXBError):
289 """Raised when the code detects arguments to a public 290 operation."""
291
292 -class LogicError (PyXBError):
293 """Raised when the code detects an implementation problem."""
294
295 -class IncompleteImplementationError (LogicError):
296 """Raised when a code branch is taken that has not yet been implemented."""
297