code: def _AddAttributeNodes(self, attribute_names):
      
      for attribute_name in attribute_names:
        self.graph[attribute_name] = self.Node(is_artifact=False)
docs: Add the attribute nodes to the graph.
  
      For every attribute that is required for the collection of requested
      artifacts, add a node to the dependency graph. An attribute node will have
      incoming edges from the artifacts that provide this attribute and outgoing
      edges to the artifacts that depend on it.
  
      An attribute is reachable as soon as one artifact that provides it is
      reachable. Initially, no attribute node is reachable.
  
      Args:
        attribute_names: List of required attribute names.