def ProcessIndexNode(self, node):
        """Processes XML <datastore-index> nodes into Index objects.

    The following information is parsed out:
    kind: specifies the kind of entities to index.
    ancestor: true if the index supports queries that filter by
      ancestor-key to constraint results to a single entity group.
    property: represents the entity properties to index, with a name
      and direction attribute.

    Args:
      node: <datastore-index> XML node in datastore-indexes.xml.
    """
        if node.tag != 'datastore-index':
            self.errors.append('Unrecognized node: <%s>' % node.tag)
            return

        index = Index()
        index.kind = node.attrib.get('kind', '')
        if not index.kind:
            self.errors.append(MISSING_KIND)
        ancestor = node.attrib.get('ancestor', 'false')
        index.ancestor = _BooleanAttribute(ancestor)
        if index.ancestor is None:
            self.errors.append(
                'Value for ancestor should be true or false, not "%s"' %
                ancestor)
        properties = []
        property_nodes = [n for n in node.getchildren() if n.tag == 'property']
        for property_node in property_nodes:
            name = property_node.attrib.get('name', '')
            if not name:
                self.errors.append(NAME_MISSING % index.kind)
                continue

            direction = property_node.attrib.get('direction', 'asc')
            if direction not in ('asc', 'desc'):
                self.errors.append(BAD_DIRECTION % direction)
                continue
            properties.append(Property(name=name, direction=direction))
        index.properties = properties
        self.indexes.append(index)
  def ProcessIndexNode(self, node):
    """Processes XML <datastore-index> nodes into Index objects.

    The following information is parsed out:
    kind: specifies the kind of entities to index.
    ancestor: true if the index supports queries that filter by
      ancestor-key to constraint results to a single entity group.
    property: represents the entity properties to index, with a name
      and direction attribute.

    Args:
      node: <datastore-index> XML node in datastore-indexes.xml.
    """
    if node.tag != 'datastore-index':
      self.errors.append('Unrecognized node: <%s>' % node.tag)
      return

    index = Index()
    index.kind = node.attrib.get('kind', '')
    if not index.kind:
      self.errors.append(MISSING_KIND)
    ancestor = node.attrib.get('ancestor', 'false')
    index.ancestor = _BooleanAttribute(ancestor)
    if index.ancestor is None:
      self.errors.append(
          'Value for ancestor should be true or false, not "%s"' % ancestor)
    properties = []
    property_nodes = [n for n in node.getchildren() if n.tag == 'property']
    for property_node in property_nodes:
      name = property_node.attrib.get('name', '')
      if not name:
        self.errors.append(NAME_MISSING % index.kind)
        continue

      direction = property_node.attrib.get('direction', 'asc')
      if direction not in ('asc', 'desc'):
        self.errors.append(BAD_DIRECTION % direction)
        continue
      properties.append(Property(name=name, direction=direction))
    index.properties = properties
    self.indexes.append(index)