class_docstr: Handle a pipe of processors
  Attributes:
      processor: List of all processors in the Process pipe
      results : Dictionnary of Results Container from all the analyzers
                in the Pipe process
class_docstr_tok: ["Handle","a","pipe","of","processors","Attributes",":","processor",":","List","of","all","processors","in","the","Process","pipe","results",":","Dictionnary","of","Results","Container","from","all","the","analyzers","in","the","Pipe","process"]
docstr: Append a new processor to the pipe
code: def append_processor(self, proc, source_proc=None):
      "Append a new processor to the pipe"
      if source_proc is None and len(self.processors):
          source_proc = self.processors[0]
  
      if source_proc and not isinstance(source_proc, Processor):
          raise TypeError("source_proc must be a Processor or None")
  
      if not isinstance(proc, Processor):
          raise TypeError("proc must be a Processor or None")
  
      if proc.type == "decoder" and len(self.processors):
          raise ValueError(
              "Only the first processor in a pipe could be a Decoder"
          )
  
      # TODO : check if the processor is already in the pipe
      if source_proc:
          if hasattr(self._graph, "neighbors"):
              neighbors = self._graph.neighbors
          else:  # py2 compat
              neighbors = self._graph.neighbors_iter
          for child in neighbors(source_proc.uuid()):
              child_proc = self._graph.node[child]["processor"]
              if proc == child_proc:
                  proc._uuid = child_proc.uuid()
                  proc.process_pipe = self
                  break
      if not self._graph.has_node(proc.uuid()):
          self.processors.append(proc)  # Add processor to the pipe
          self._graph.add_node(
              proc.uuid(), processor=proc, id=proc.id()
          )
          if source_proc:
              self._graph.add_edge(
                  self.processors[0].uuid(),
                  proc.uuid(),
                  type="audio_source",
              )
          proc.process_pipe = self
          # Add an edge between each parent and proc
          for parent in proc.parents.values():
              self._graph.add_edge(
                  parent.uuid(), proc.uuid(), type="data_source"
              )
  
imports: from .component import Component, MetaComponent, abstract
  from .component import implements, implementations, interfacedoc
  from .api import IProcessor
  from .exceptions import Error, PIDError, ApiError
  from .tools.parameters import HasParam
  import re
  import datetime
  import numpy
  import uuid
  import networkx
  import inspect
  import os
  import csv
  import sys
label_desc: Use image node_id 2 for calling the ProcessPipe obj's underlying member method code with example usage: obj.append_processor(proc, source_proc) without return types