Source code for ymp.cli.init
"Implements subcommands for ``ymp init``"
import logging
import os
import shutil
import subprocess as sp
import click
import ymp
from ymp.cli.shared_options import command, group
log = logging.getLogger(__name__) # pylint: disable=invalid-name
@group()
def init():
"""Initialize YMP workspace"""
[docs]def have_command(cmd):
try:
sp.run("command -v " + cmd, shell=True, stdout=sp.DEVNULL, check=True)
except sp.CalledProcessError:
log.debug("Command '%s' not found", cmd)
return False
log.debug("Command '%s' found", cmd)
return True
@init.command()
@click.option("--yes", "-y", is_flag=True, help="Confirm every prompt")
def cluster(yes):
"""Set up cluster"""
cfg = ymp.get_config()._config
if cfg.cluster.profile is not None and not yes:
click.confirm("Cluster profile '{}' already configured. "
"Do you want to overwrite this setting?"
"".format(cfg.cluster.profile),
abort=True)
log.warning("Trying to detect cluster type")
log.debug("Checking for SLURM")
if have_command("sbatch"):
log.warning("Found SLURM. Updating config.")
cfg["cluster"]["profile"] = "slurm"
elif have_command("qsub"):
log.warning("Detected SGE or Torque")
else:
log.warning("No cluster submit commands found")
cfg["cluster"]["profile"] = None
log.warning("Saving config")
cfg.save()
@init.command()
@click.argument("name", required=False)
@click.option("--yes", "-y", is_flag=True, help="Confirm every prompt")
def project(name, yes):
cfg = ymp.get_config()._config
if not name:
name = click.prompt("Please enter a name for the new project",
type=str)
if name in cfg.projects and not yes:
click.confirm("Project '{}' already configured. "
"Do you want to overwrite this project?"
"".format(name),
abort=True)
cfg.projects[name] = {'data': None}
log.warning("Saving config")
cfg.save()
@init.command()
def demo():
"""
Copies YMP tutorial data into the current working directory
"""
click.echo("Copying tutorial data to current working directory...")
cwd_path = os.getcwd()
cwd_files = os.listdir(cwd_path)
demo_path = os.path.join(ymp._rsc_dir, "demo")
demo_files = os.listdir(demo_path)
conflicts = [f for f in demo_files if f in cwd_files]
if len(cwd_files) > 10:
click.confirm(
"WARNING: "
"The current working directory already contains a lot of files.\n"
" Using an empty directory to start with is highly suggested.\n"
" Do you want to continue?", abort=True)
if conflicts:
click.confirm(
"WARNING: "
"This operation would overwrite the following files: {}\n"
" Do you want to continue?".format(conflicts), abort=True)
for f in conflicts:
if os.path.isdir(f):
shutil.rmtree(f)
else:
os.unlink(f)
for f in demo_files:
src = os.path.join(demo_path, f)
dst = os.path.join(cwd_path, f)
if os.path.isdir(src):
shutil.copytree(src, dst)
else:
shutil.copy(src, dst)
click.echo("done.")
click.echo("")
click.echo("Try running 'ymp make toy.assemble_megahit.map_bbmap',")
click.echo("or see https://ymp.readthedocs.io for more examples.")