docs: def to_drake_step(inputs, output):
      """
      Args:
          inputs: collection of input Steps
          output: output Step
  
      Returns: a string of the drake step for the given inputs and output
      """
      i = [output._yaml_filename]
      i.extend(map(lambda i: i._target_filename, list(inputs)))
      i.extend(output.dependencies)
  
      # add source file of output and its non-target inputs
      # if they're not in the drain library
      objects = get_inputs(output, target=False)
      objects.add(output)
      sources = set([os.path.abspath(inspect.getsourcefile(o.__class__)) for o in objects])
      i.extend([s for s in sources if not s.startswith(os.path.dirname(__file__))])
  
      output_str = '%' + output.__class__.__name__
      if output.name:
          output_str += ', %' + output.name
      if output.target:
          output_str += ', ' + os.path.join(output._target_filename)
      return '{output} <- {inputs} [method:drain]\n\n'.format(
              output=output_str, inputs=str.join(', ', i))