Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/cwltool/argparser.py @ 2:6af9afd405e9 draft
"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author | shellac |
---|---|
date | Thu, 14 May 2020 14:56:58 -0400 |
parents | 26e78fe6e8c4 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/env/lib/python3.7/site-packages/cwltool/argparser.py Thu May 14 14:56:58 2020 -0400 @@ -0,0 +1,480 @@ +"""Command line argument parsing for cwltool.""" +from __future__ import absolute_import, print_function + +import argparse +import os +from typing import (Any, AnyStr, Dict, List, MutableMapping, MutableSequence, + Optional, Sequence, Union, cast) + +from schema_salad.ref_resolver import file_uri +from typing_extensions import Text # pylint: disable=unused-import +# move to a regular typing import when Python 3.3-3.6 is no longer supported + +from .loghandler import _logger +from .process import Process, shortname # pylint: disable=unused-import +from .resolver import ga4gh_tool_registries +from .software_requirements import SOFTWARE_REQUIREMENTS_ENABLED +from .utils import DEFAULT_TMP_PREFIX + + +def arg_parser(): # type: () -> argparse.ArgumentParser + parser = argparse.ArgumentParser( + description='Reference executor for Common Workflow Language standards.') + parser.add_argument("--basedir", type=Text) + parser.add_argument("--outdir", type=Text, default=os.path.abspath('.'), + help="Output directory, default current directory") + + parser.add_argument("--parallel", action="store_true", default=False, + help="[experimental] Run jobs in parallel. ") + envgroup = parser.add_mutually_exclusive_group() + envgroup.add_argument("--preserve-environment", type=Text, action="append", + help="Preserve specific environment variable when " + "running CommandLineTools. May be provided multiple " + "times.", metavar="ENVVAR", default=["PATH"], + dest="preserve_environment") + envgroup.add_argument("--preserve-entire-environment", action="store_true", + help="Preserve all environment variable when running " + "CommandLineTools.", default=False, + dest="preserve_entire_environment") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--rm-container", action="store_true", default=True, + help="Delete Docker container used by jobs after they exit (default)", + dest="rm_container") + + exgroup.add_argument( + "--leave-container", action="store_false", default=True, + help="Do not delete Docker container used by jobs after they exit", + dest="rm_container") + + cidgroup = parser.add_argument_group( + "Options for recording the Docker container identifier into a file.") + # Disabled as containerid is now saved by default + cidgroup.add_argument("--record-container-id", action="store_true", + default=False, + help = argparse.SUPPRESS, + dest="record_container_id") + + cidgroup.add_argument( + "--cidfile-dir", type=Text, help="Store the Docker " + "container ID into a file in the specified directory.", + default=None, dest="cidfile_dir") + + cidgroup.add_argument( + "--cidfile-prefix", type=Text, + help="Specify a prefix to the container ID filename. " + "Final file name will be followed by a timestamp. " + "The default is no prefix.", + default=None, dest="cidfile_prefix") + + parser.add_argument("--tmpdir-prefix", type=Text, + help="Path prefix for temporary directories", + default=DEFAULT_TMP_PREFIX) + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--tmp-outdir-prefix", type=Text, + help="Path prefix for intermediate output directories", + default=DEFAULT_TMP_PREFIX) + + exgroup.add_argument( + "--cachedir", type=Text, default="", + help="Directory to cache intermediate workflow outputs to avoid recomputing steps.") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--rm-tmpdir", action="store_true", default=True, + help="Delete intermediate temporary directories (default)", + dest="rm_tmpdir") + + exgroup.add_argument("--leave-tmpdir", action="store_false", + default=True, help="Do not delete intermediate temporary directories", + dest="rm_tmpdir") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument( + "--move-outputs", action="store_const", const="move", default="move", + help="Move output files to the workflow output directory and delete " + "intermediate output directories (default).", dest="move_outputs") + + exgroup.add_argument("--leave-outputs", action="store_const", const="leave", default="move", + help="Leave output files in intermediate output directories.", + dest="move_outputs") + + exgroup.add_argument("--copy-outputs", action="store_const", const="copy", default="move", + help="Copy output files to the workflow output directory, don't delete intermediate output directories.", + dest="move_outputs") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--enable-pull", default=True, action="store_true", + help="Try to pull Docker images", dest="pull_image") + + exgroup.add_argument("--disable-pull", default=True, action="store_false", + help="Do not try to pull Docker images", dest="pull_image") + + parser.add_argument("--rdf-serializer", + help="Output RDF serialization format used by --print-rdf (one of turtle (default), n3, nt, xml)", + default="turtle") + + parser.add_argument("--eval-timeout", + help="Time to wait for a Javascript expression to evaluate before giving an error, default 20s.", + type=float, + default=20) + + provgroup = parser.add_argument_group("Options for recording provenance " + "information of the execution") + provgroup.add_argument("--provenance", + help="Save provenance to specified folder as a " + "Research Object that captures and aggregates " + "workflow execution and data products.", + type=Text) + + provgroup.add_argument("--enable-user-provenance", default=False, + action="store_true", + help="Record user account info as part of provenance.", + dest="user_provenance") + provgroup.add_argument("--disable-user-provenance", default=False, + action="store_false", + help="Do not record user account info in provenance.", + dest="user_provenance") + provgroup.add_argument("--enable-host-provenance", default=False, + action="store_true", + help="Record host info as part of provenance.", + dest="host_provenance") + provgroup.add_argument("--disable-host-provenance", default=False, + action="store_false", + help="Do not record host info in provenance.", + dest="host_provenance") + provgroup.add_argument( + "--orcid", help="Record user ORCID identifier as part of " + "provenance, e.g. https://orcid.org/0000-0002-1825-0097 " + "or 0000-0002-1825-0097. Alternatively the environment variable " + "ORCID may be set.", dest="orcid", default=os.environ.get("ORCID", ''), + type=Text) + provgroup.add_argument( + "--full-name", help="Record full name of user as part of provenance, " + "e.g. Josiah Carberry. You may need to use shell quotes to preserve " + "spaces. Alternatively the environment variable CWL_FULL_NAME may " + "be set.", dest="cwl_full_name", default=os.environ.get("CWL_FULL_NAME", ''), + type=Text) + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--print-rdf", action="store_true", + help="Print corresponding RDF graph for workflow and exit") + exgroup.add_argument("--print-dot", action="store_true", + help="Print workflow visualization in graphviz format and exit") + exgroup.add_argument("--print-pre", action="store_true", help="Print CWL document after preprocessing.") + exgroup.add_argument("--print-deps", action="store_true", help="Print CWL document dependencies.") + exgroup.add_argument("--print-input-deps", action="store_true", help="Print input object document dependencies.") + exgroup.add_argument("--pack", action="store_true", help="Combine components into single document and print.") + exgroup.add_argument("--version", action="store_true", help="Print version and exit") + exgroup.add_argument("--validate", action="store_true", help="Validate CWL document only.") + exgroup.add_argument("--print-supported-versions", action="store_true", help="Print supported CWL specs.") + exgroup.add_argument("--print-subgraph", action="store_true", + help="Print workflow subgraph that will execute " + "(can combine with --target)") + exgroup.add_argument("--print-targets", action="store_true", help="Print targets (output parameters)") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--strict", action="store_true", + help="Strict validation (unrecognized or out of place fields are error)", + default=True, dest="strict") + exgroup.add_argument("--non-strict", action="store_false", help="Lenient validation (ignore unrecognized fields)", + default=True, dest="strict") + + parser.add_argument("--skip-schemas", action="store_true", + help="Skip loading of schemas", default=False, dest="skip_schemas") + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--verbose", action="store_true", help="Default logging") + exgroup.add_argument("--quiet", action="store_true", help="Only print warnings and errors.") + exgroup.add_argument("--debug", action="store_true", help="Print even more logging") + + parser.add_argument( + "--strict-memory-limit", action="store_true", help="When running with " + "software containers and the Docker engine, pass either the " + "calculated memory allocation from ResourceRequirements or the " + "default of 1 gigabyte to Docker's --memory option.") + + parser.add_argument("--timestamps", action="store_true", help="Add " + "timestamps to the errors, warnings, and " + "notifications.") + parser.add_argument("--js-console", action="store_true", help="Enable javascript console output") + parser.add_argument("--disable-js-validation", action="store_true", help="Disable javascript validation.") + parser.add_argument("--js-hint-options-file", + type=Text, + help="File of options to pass to jshint." + "This includes the added option \"includewarnings\". ") + dockergroup = parser.add_mutually_exclusive_group() + dockergroup.add_argument("--user-space-docker-cmd", metavar="CMD", + help="(Linux/OS X only) Specify a user space docker " + "command (like udocker or dx-docker) that will be " + "used to call 'pull' and 'run'") + dockergroup.add_argument("--singularity", action="store_true", + default=False, help="[experimental] Use " + "Singularity runtime for running containers. " + "Requires Singularity v2.6.1+ and Linux with kernel " + "version v3.18+ or with overlayfs support " + "backported.") + dockergroup.add_argument("--no-container", action="store_false", + default=True, help="Do not execute jobs in a " + "Docker container, even when `DockerRequirement` " + "is specified under `hints`.", + dest="use_container") + + dependency_resolvers_configuration_help = argparse.SUPPRESS + dependencies_directory_help = argparse.SUPPRESS + use_biocontainers_help = argparse.SUPPRESS + conda_dependencies = argparse.SUPPRESS + + if SOFTWARE_REQUIREMENTS_ENABLED: + dependency_resolvers_configuration_help = "Dependency resolver configuration file describing how to adapt 'SoftwareRequirement' packages to current system." + dependencies_directory_help = "Defaut root directory used by dependency resolvers configuration." + use_biocontainers_help = "Use biocontainers for tools without an explicitly annotated Docker container." + conda_dependencies = "Short cut to use Conda to resolve 'SoftwareRequirement' packages." + + parser.add_argument("--beta-dependency-resolvers-configuration", default=None, help=dependency_resolvers_configuration_help) + parser.add_argument("--beta-dependencies-directory", default=None, help=dependencies_directory_help) + parser.add_argument("--beta-use-biocontainers", default=None, help=use_biocontainers_help, action="store_true") + parser.add_argument("--beta-conda-dependencies", default=None, help=conda_dependencies, action="store_true") + + parser.add_argument("--tool-help", action="store_true", help="Print command line help for tool") + + parser.add_argument("--relative-deps", choices=['primary', 'cwd'], + default="primary", help="When using --print-deps, print paths " + "relative to primary file or current working directory.") + + parser.add_argument("--enable-dev", action="store_true", + help="Enable loading and running development versions " + "of CWL spec.", default=False) + + parser.add_argument("--enable-ext", action="store_true", + help="Enable loading and running cwltool extensions " + "to CWL spec.", default=False) + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--enable-color", action="store_true", + help="Enable logging color (default enabled)", default=True) + exgroup.add_argument("--disable-color", action="store_false", dest="enable_color", + help="Disable colored logging (default false)") + + parser.add_argument("--default-container", + help="Specify a default docker container that will be used if the workflow fails to specify one.") + parser.add_argument("--no-match-user", action="store_true", + help="Disable passing the current uid to `docker run --user`") + parser.add_argument("--custom-net", type=Text, + help="Passed to `docker run` as the '--net' " + "parameter when NetworkAccess is true.") + parser.add_argument("--disable-validate", dest="do_validate", + action="store_false", default=True, + help=argparse.SUPPRESS) + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--enable-ga4gh-tool-registry", action="store_true", help="Enable resolution using GA4GH tool registry API", + dest="enable_ga4gh_tool_registry", default=True) + exgroup.add_argument("--disable-ga4gh-tool-registry", action="store_false", help="Disable resolution using GA4GH tool registry API", + dest="enable_ga4gh_tool_registry", default=True) + + parser.add_argument("--add-ga4gh-tool-registry", action="append", help="Add a GA4GH tool registry endpoint to use for resolution, default %s" % ga4gh_tool_registries, + dest="ga4gh_tool_registries", default=[]) + + parser.add_argument("--on-error", + help="Desired workflow behavior when a step fails. One of 'stop' (do not submit any more steps) or " + "'continue' (may submit other steps that are not downstream from the error). Default is 'stop'.", + default="stop", choices=("stop", "continue")) + + exgroup = parser.add_mutually_exclusive_group() + exgroup.add_argument("--compute-checksum", action="store_true", default=True, + help="Compute checksum of contents while collecting outputs", + dest="compute_checksum") + exgroup.add_argument("--no-compute-checksum", action="store_false", + help="Do not compute checksum of contents while collecting outputs", + dest="compute_checksum") + + parser.add_argument("--relax-path-checks", action="store_true", + default=False, help="Relax requirements on path names to permit " + "spaces and hash characters.", dest="relax_path_checks") + exgroup.add_argument("--make-template", action="store_true", + help="Generate a template input object") + + parser.add_argument("--force-docker-pull", action="store_true", + default=False, help="Pull latest docker image even if" + " it is locally present", dest="force_docker_pull") + parser.add_argument("--no-read-only", action="store_true", + default=False, help="Do not set root directory in the" + " container as read-only", dest="no_read_only") + + parser.add_argument("--overrides", type=str, + default=None, help="Read process requirement overrides from file.") + + parser.add_argument("--target", "-t", action="append", + help="Only execute steps that contribute to " + "listed targets (can provide more than once).") + + parser.add_argument("workflow", type=Text, nargs="?", default=None, + metavar='cwl_document', help="path or URL to a CWL Workflow, " + "CommandLineTool, or ExpressionTool. If the `inputs_object` has a " + "`cwl:tool` field indicating the path or URL to the cwl_document, " + " then the `workflow` argument is optional.") + parser.add_argument("job_order", nargs=argparse.REMAINDER, + metavar='inputs_object', help="path or URL to a YAML or JSON " + "formatted description of the required input values for the given " + "`cwl_document`.") + + return parser + + +def get_default_args(): + # type: () -> Dict[str, Any] + """Get default values of cwltool's command line options.""" + ap = arg_parser() + args = ap.parse_args([]) + return vars(args) + + +class FSAction(argparse.Action): + objclass = None # type: Text + + def __init__(self, option_strings, dest, nargs=None, **kwargs): + # type: (List[Text], Text, Any, **Any) -> None + """Fail if nargs is used.""" + if nargs is not None: + raise ValueError("nargs not allowed") + super(FSAction, self).__init__(option_strings, dest, **kwargs) + + def __call__(self, + parser, # type: argparse.ArgumentParser + namespace, # type: argparse.Namespace + values, # type: Union[AnyStr, Sequence[Any], None] + option_string=None # type: Optional[Text] + ): # type: (...) -> None + setattr(namespace, + self.dest, + {"class": self.objclass, + "location": file_uri(str(os.path.abspath(cast(AnyStr, values))))}) + + +class FSAppendAction(argparse.Action): + objclass = None # type: Text + + def __init__(self, option_strings, dest, nargs=None, **kwargs): + # type: (List[Text], Text, Any, **Any) -> None + """Initialize.""" + if nargs is not None: + raise ValueError("nargs not allowed") + super(FSAppendAction, self).__init__(option_strings, dest, **kwargs) + + def __call__(self, + parser, # type: argparse.ArgumentParser + namespace, # type: argparse.Namespace + values, # type: Union[AnyStr, Sequence[Any], None] + option_string=None # type: Optional[Text] + ): # type: (...) -> None + g = getattr(namespace, self.dest) + if not g: + g = [] + setattr(namespace, self.dest, g) + g.append( + {"class": self.objclass, + "location": file_uri(str(os.path.abspath(cast(AnyStr, values))))}) + + +class FileAction(FSAction): + objclass = "File" + + +class DirectoryAction(FSAction): + objclass = "Directory" + + +class FileAppendAction(FSAppendAction): + objclass = "File" + + +class DirectoryAppendAction(FSAppendAction): + objclass = "Directory" + + +def add_argument(toolparser, name, inptype, records, description="", + default=None, input_required=True): + # type: (argparse.ArgumentParser, Text, Any, List[Text], Text, Any, bool) -> None + if len(name) == 1: + flag = "-" + else: + flag = "--" + + # if input_required is false, don't make the command line + # parameter required. + required = default is None and input_required + if isinstance(inptype, MutableSequence): + if inptype[0] == "null": + required = False + if len(inptype) == 2: + inptype = inptype[1] + else: + _logger.debug(u"Can't make command line argument from %s", inptype) + return None + + ahelp = description.replace("%", "%%") + action = None # type: Optional[Union[argparse.Action, Text]] + atype = None # type: Any + + if inptype == "File": + action = cast(argparse.Action, FileAction) + elif inptype == "Directory": + action = cast(argparse.Action, DirectoryAction) + elif isinstance(inptype, MutableMapping) and inptype["type"] == "array": + if inptype["items"] == "File": + action = cast(argparse.Action, FileAppendAction) + elif inptype["items"] == "Directory": + action = cast(argparse.Action, DirectoryAppendAction) + else: + action = "append" + elif isinstance(inptype, MutableMapping) and inptype["type"] == "enum": + atype = Text + elif isinstance(inptype, MutableMapping) and inptype["type"] == "record": + records.append(name) + for field in inptype['fields']: + fieldname = name + "." + shortname(field['name']) + fieldtype = field['type'] + fielddescription = field.get("doc", "") + add_argument( + toolparser, fieldname, fieldtype, records, + fielddescription) + return + elif inptype == "string": + atype = Text + elif inptype == "int": + atype = int + elif inptype == "double": + atype = float + elif inptype == "float": + atype = float + elif inptype == "boolean": + action = "store_true" + else: + _logger.debug(u"Can't make command line argument from %s", inptype) + return None + + if inptype != "boolean": + typekw = {'type': atype} + else: + typekw = {} + + toolparser.add_argument( # type: ignore + flag + name, required=required, help=ahelp, action=action, + default=default, **typekw) + + +def generate_parser(toolparser, tool, namemap, records, input_required=True): + # type: (argparse.ArgumentParser, Process, Dict[Text, Text], List[Text], bool) -> argparse.ArgumentParser + toolparser.add_argument("job_order", nargs="?", help="Job input json file") + namemap["job_order"] = "job_order" + + for inp in tool.tool["inputs"]: + name = shortname(inp["id"]) + namemap[name.replace("-", "_")] = name + inptype = inp["type"] + description = inp.get("doc", "") + default = inp.get("default", None) + add_argument(toolparser, name, inptype, records, description, default, input_required) + + return toolparser