docs: def GetArtifactsInProperOrder(self):
      """Bring the artifacts in a linear order that resolves dependencies.
  
      This method obtains a linear ordering of the nodes and then returns the list
      of artifact names.
  
      Returns:
        A list of `ArtifactName` instances such that if they are collected in the
        given order their dependencies are resolved.
      """
      artifact_list = []
      while self.reachable_nodes:
        node_name = self.reachable_nodes.pop()
        node = self.graph[node_name]
        if node.is_artifact:
          artifact_list.append(node_name)
        for next_node_name in node.outgoing:
          if next_node_name not in self.graph:
            continue
          next_node = self.graph[next_node_name]
          if next_node.is_provided:
            continue
          next_node.incoming.remove(node_name)
          if not (next_node.is_artifact and next_node.incoming):
            next_node.is_provided = True
            self.reachable_nodes.add(next_node_name)
      return artifact_list