code: def spill(self, src, dest):
          
          #  print(dest)
  
          if exists(dest) and not isdir(dest):
              raise Exception("Not a directory: %s" % dest)
  
          # If dest is an existing directory, try to derive its name from src
          if isdir(dest):
              workspace_name = re.sub(r'(\.ocrd)?\.zip$', '', basename(src))
              new_dest = join(dest, workspace_name)
              if exists(new_dest):
                  raise Exception("Directory exists: %s" % new_dest)
              dest = new_dest
  
          log.info("Spilling %s to %s", src, dest)
  
          bagdir = mkdtemp(prefix=TMP_BAGIT_PREFIX)
          unzip_file_to_dir(src, bagdir)
  
          datadir = join(bagdir, 'data')
          for root, _, files in walk(datadir):
              for f in files:
                  srcfile = join(root, f)
                  destdir = join(dest, relpath(root, datadir))
                  destfile = join(destdir, f)
                  if not exists(destdir):
                      makedirs(destdir)
                  log.debug("Copy %s -> %s", srcfile, destfile)
                  copyfile(srcfile, destfile)
  
          # TODO copy allowed tag files if present
  
          # TODO validate bagit
  
          # Drop tempdir
          rmtree(bagdir)
  
          # Create workspace
          workspace = Workspace(self.resolver, directory=dest)
  
          # TODO validate workspace
  
          return workspace
docs: Spill a workspace, i.e. unpack it and turn it into a workspace.
  
          See https://ocr-d.github.com/ocrd_zip#unpacking-ocrd-zip-to-a-workspace
  
          Arguments:
              src (string): Path to OCRD-ZIP
              dest (string): Path to directory to unpack data folder to