Skip to content

Commit

Permalink
Merge 48c8a08 into 24b903a
Browse files Browse the repository at this point in the history
  • Loading branch information
mlin committed Jun 15, 2019
2 parents 24b903a + 48c8a08 commit 2db4da8
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 2 deletions.
48 changes: 46 additions & 2 deletions WDL/CLI.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
"""
miniwdl command-line interface
"""
# PYTHON_ARGCOMPLETE_OK
import sys
import os
import subprocess
import tempfile
import glob
import json
import math
import pkg_resources
import argcomplete
from shlex import quote as shellquote
from datetime import datetime
from argparse import ArgumentParser, Action
import pkg_resources
import WDL
import WDL.Lint
from . import values_from_json, values_to_json
Expand All @@ -33,6 +35,7 @@ def main(args=None):
fill_common(fill_check_subparser(subparsers))
fill_common(fill_cromwell_subparser(subparsers))

argcomplete.autocomplete(parser)
args = parser.parse_args(args if args is not None else sys.argv[1:])

try:
Expand Down Expand Up @@ -259,7 +262,7 @@ def fill_cromwell_subparser(subparsers):
type=str,
nargs="*",
help="Workflow inputs. Arrays may be supplied by repeating, key=value1 key=value2 ...",
)
).completer = cromwell_input_completer
cromwell_parser.add_argument(
"-d",
"--dir",
Expand All @@ -286,6 +289,47 @@ def fill_cromwell_subparser(subparsers):
return cromwell_parser


def cromwell_input_completer(prefix, parsed_args, **kwargs):
# argcomplete completer for `miniwdl cromwell`
if "uri" in parsed_args:
# load document. in the completer setting, we need to substitute ~ and $HOME
# (technically other environment variables too, but this covers most needs)
uri = parsed_args.uri
if uri.startswith("~/") or uri.startswith("$HOME/"):
uri = os.path.join(os.path.expanduser("~"), uri[(uri.index("/") + 1) :])
if not os.path.exists(uri):
argcomplete.warn("file not found: " + uri)
return []
try:
doc = WDL.load(uri, parsed_args.path, parsed_args.check_quant, import_uri=import_uri)
except Exception as exn:
argcomplete.warn(
"unable to load {}; try 'miniwdl check' on it ({})".format(uri, str(exn))
)
return []
# resolve target
if doc.workflow:
target = doc.workflow
elif len(doc.tasks) == 1:
target = doc.tasks[0]
elif len(doc.tasks) > 1:
argcomplete.warn("WDL document contains multiple tasks and no workflow")
return []
else:
argcomplete.warn("WDL document is empty")
return []
assert target
# figure the available input names (starting with prefix, if any)
available_input_names = [nm + "=" for nm in values_to_json(target.available_inputs)]
if prefix and prefix.find("=") == -1:
available_input_names = [nm for nm in available_input_names if nm.startswith(prefix)]
# TODO idea -- complete only required inputs until they're all present, then start
# completing the non-required inputs. Tricky with arrays, because we want to keep
# allowing their completion even after already supplied.
# compute set of inputs already supplied
return available_input_names


def cromwell(uri, inputs, json_only, empty, check_quant, rundir=None, path=None, **kwargs):
path = path or []

Expand Down
1 change: 1 addition & 0 deletions WDL/__main__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
# PYTHON_ARGCOMPLETE_OK
import WDL.CLI

if __name__ == "__main__":
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
setuptools
lark-parser==0.7.1
docker
argcomplete
7 changes: 7 additions & 0 deletions stubs/argcomplete/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from argparse import ArgumentParser

def autocomplete(parser : ArgumentParser) -> None:
...

def warn(msg : str) -> None:
...

0 comments on commit 2db4da8

Please sign in to comment.