Source code for ymp.cli.stage
import logging
import textwrap
from fnmatch import fnmatch
import click
from ymp.cli.shared_options import group
log = logging.getLogger(__name__) # pylint: disable=invalid-name
[docs]def wrap(header, data):
wrapper = textwrap.TextWrapper(
initial_indent=header + " ",
subsequent_indent=" " * len(header) + " "
)
return "\n"+"\n".join(wrapper.wrap(" ".join(data)))
@group()
def stage():
"""
Manipulate YMP stages
"""
@stage.command(name="list")
@click.option(
"--long", "-l", "long_opt", is_flag=True,
help="Show full stage descriptions"
)
@click.option(
"--short", "-s", "short_opt", is_flag=True,
help="Show only stage names"
)
@click.option(
"--code", "-c", "code_opt", is_flag=True,
help="Show definition file name and line number"
)
@click.option(
"--types", "-t", "type_opt", is_flag=True,
help="Show input/output types"
)
@click.argument(
"stage_opt", metavar="STAGE", nargs=-1
)
def ls(long_opt, short_opt, stage_opt, code_opt, type_opt):
"""
List available stages
"""
if long_opt and short_opt:
raise click.UsageError(
"Options --long and --short are mutually exclusive")
from ymp.stage import Stage
all_stages = Stage.get_registry()
if stage_opt:
stages = [all_stages[m] for m in all_stages
if any(fnmatch(m, pat) for pat in stage_opt)]
else:
stages = list(all_stages.values())
stages = sorted(list(set(stages)), key=lambda s: s.name)
if not stages: # nothing to show
return
name_width = max(len(x.name) for x in stages)
for stage in stages:
if hasattr(stage, 'docstring'):
doc = stage.docstring.strip().split("\n", 1)
short_doc = doc[0].strip()
if len(doc) > 1:
long_doc = textwrap.dedent(doc[1])
else:
long_doc = ""
else:
short_doc = "[no docs]"
long_doc = ""
if long_doc and long_opt:
description = "\n".join(" " + l for l in long_doc.split("\n"))
else:
description = ""
if short_doc and not short_opt:
summary = " " + short_doc
else:
summary = ""
if code_opt:
code = "\n defined in: {}:{}".format(stage.filename, stage.lineno)
else:
code = ""
if type_opt:
dtypes = (wrap(" inputs: ", stage.get_inputs()) +
wrap(" outputs:", stage.outputs))
else:
dtypes = ""
print("{name:<{width}}{summary}{description}{code}{dtypes}\n"
"".format(name=stage.name,
width=name_width,
summary=summary,
code=code,
dtypes=dtypes,
description=description))