예제 #1
0
 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)
예제 #2
0
    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)
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
 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)