def _traverse_element_cls(self, element_cls): try: if not issubclass(element_cls, elements.Element): raise exceptions.DSLParsingSchemaAPIException(1) except TypeError: raise exceptions.DSLParsingSchemaAPIException(1) self._traverse_schema(element_cls.schema)
def _validate_leaf_type(self, schema_type): """Check that schema_type is valid for typechecking schema_type needs to be something that can go into isinstance() checks, ie. a class, type, or tuple of classes and types. Additionally, an empty schema is not allowed. """ if not schema_type: raise exceptions.DSLParsingSchemaAPIException(1) try: isinstance(None, schema_type) except TypeError: raise exceptions.DSLParsingSchemaAPIException(1)
def _traverse_schema(self, schema, list_nesting=0): if isinstance(schema, dict): for key, value in schema.items(): if not isinstance(key, basestring): raise exceptions.DSLParsingSchemaAPIException(1) self._traverse_element_cls(value) elif isinstance(schema, list): if list_nesting > 0: raise exceptions.DSLParsingSchemaAPIException(1) if len(schema) == 0: raise exceptions.DSLParsingSchemaAPIException(1) for value in schema: self._traverse_schema(value, list_nesting+1) elif isinstance(schema, elements.ElementType): if isinstance(schema, elements.Leaf): if not isinstance(schema.type, (type, list, tuple)): raise exceptions.DSLParsingSchemaAPIException(1) if (isinstance(schema.type, (list, tuple)) and (not schema.type or not all([isinstance(i, type) for i in schema.type]))): raise exceptions.DSLParsingSchemaAPIException(1) elif isinstance(schema, elements.Dict): self._traverse_element_cls(schema.type) elif isinstance(schema, elements.List): self._traverse_element_cls(schema.type) else: raise exceptions.DSLParsingSchemaAPIException(1) else: raise exceptions.DSLParsingSchemaAPIException(1)
def _traverse_schema(self, schema, list_nesting=0): if isinstance(schema, dict): for key, value in schema.items(): if not isinstance(key, text_type): raise exceptions.DSLParsingSchemaAPIException(1) self._traverse_element_cls(value) elif isinstance(schema, list): if list_nesting > 0: raise exceptions.DSLParsingSchemaAPIException(1) if len(schema) == 0: raise exceptions.DSLParsingSchemaAPIException(1) for value in schema: self._traverse_schema(value, list_nesting + 1) elif isinstance(schema, elements.ElementType): if isinstance(schema, elements.Leaf): self._validate_leaf_type(schema.type) elif isinstance(schema, elements.Dict): self._traverse_element_cls(schema.type) elif isinstance(schema, elements.List): self._traverse_element_cls(schema.type) else: raise exceptions.DSLParsingSchemaAPIException(1) else: raise exceptions.DSLParsingSchemaAPIException(1)
def value(self): if self._parsed_value == UNPARSED: raise exceptions.DSLParsingSchemaAPIException( exceptions.ERROR_CODE_ILLEGAL_VALUE_ACCESS, 'Cannot access element value before parsing') return copy.deepcopy(self._parsed_value)