code: def draft(self):
      import nbformat
  
      preamble = self.get_preamble()
      nb = nbformat.v4.new_notebook()
      self.insert_preamble_cell(preamble, nb)
  
      nb["cells"].append(
          nbformat.v4.new_code_cell("# start coding here")
      )
      nb["metadata"] = {
          "language_info": {"name": self.get_language_name()}
      }
  
      os.makedirs(os.path.dirname(self.local_path), exist_ok=True)
  
      with open(self.local_path, "wb") as out:
          out.write(nbformat.writes(nb).encode())
  
imports: from abc import abstractmethod
  import os
  from pathlib import Path
  import tempfile
  import re
  from snakemake.exceptions import WorkflowError
  from snakemake.script import get_source, ScriptBase, PythonScript, RScript
  from snakemake.logging import logger
  from snakemake.common import is_local_file
  from snakemake.common import ON_WINDOWS
  from snakemake.sourcecache import SourceCache, infer_source_file
  from snakemake.utils import format
label_desc: Use image node_id 1 for calling the JupyterNotebook obj's underlying member method code with example usage: obj.draft() without return types