def AddDescriptorFromSchema(self, schema_name, schema):
     """Add a new MessageDescriptor named schema_name based on schema."""
     # TODO(craigcitro): Is schema_name redundant?
     if self.__GetDescriptor(schema_name):
         return
     if schema.get('enum'):
         self.__DeclareEnum(schema_name, schema)
         return
     if schema.get('type') == 'any':
         self.__DeclareMessageAlias(schema, 'extra_types.JsonValue')
         return
     if schema.get('type') != 'object':
         raise ValueError('Cannot create message descriptors for type %s',
                          schema.get('type'))
     message = extended_descriptor.ExtendedMessageDescriptor()
     message.name = self.__names.ClassName(schema['id'])
     message.description = util.CleanDescription(
         schema.get('description', 'A %s object.' % message.name))
     self.__DeclareDescriptor(message.name)
     with self.__DescriptorEnv(message):
         properties = schema.get('properties', {})
         for index, (name, attrs) in enumerate(sorted(properties.items())):
             field = self.__FieldDescriptorFromProperties(
                 name, index + 1, attrs)
             message.fields.append(field)
             if field.name != name:
                 message.field_mappings.append(
                     extended_descriptor.ExtendedMessageDescriptor.
                     JsonFieldMapping(python_name=field.name,
                                      json_name=name))
                 self.__AddImport('from %s import encoding' %
                                  self.__base_files_package)
         if 'additionalProperties' in schema:
             self.__AddAdditionalProperties(message, schema, properties)
     self.__RegisterDescriptor(message)
 def __DeclareMessageAlias(self, schema, alias_for):
     """Declare schema as an alias for alias_for."""
     # TODO(craigcitro): This is a hack. Remove it.
     message = extended_descriptor.ExtendedMessageDescriptor()
     message.name = self.__names.ClassName(schema['id'])
     message.alias_for = alias_for
     self.__DeclareDescriptor(message.name)
     self.__AddImport('from %s import extra_types' %
                      self.__base_files_package)
     self.__RegisterDescriptor(message)