diff --git a/janis_core/code/pythontool.py b/janis_core/code/pythontool.py index 100176dbb..5750e8364 100644 --- a/janis_core/code/pythontool.py +++ b/janis_core/code/pythontool.py @@ -179,7 +179,7 @@ def prepare_file_or_directory_type(file_or_directory, value): import argparse, json, sys from typing import Optional, List, Dict, Any cli = argparse.ArgumentParser("Argument parser for Janis PythonTool") -{nl.join(self.generate_cli_binding_for_input(inp) for inp in ins)} +cli.add_argument("--json", help="JSON file to parse") {type_annotation_declarations} {pt_decl} @@ -189,8 +189,9 @@ def prepare_file_or_directory_type(file_or_directory, value): try: args = cli.parse_args() - result = code_block({argkwargs}) -{extra_param_parsing} + with open(args.json) as fp: + d = json.load(fp) + result = code_block(**d) print(json.dumps(result)) except Exception as e: print(str(e), file=sys.stderr) diff --git a/janis_core/tests/test_python_tool.py b/janis_core/tests/test_python_tool.py index fe6c84eec..562874f5f 100644 --- a/janis_core/tests/test_python_tool.py +++ b/janis_core/tests/test_python_tool.py @@ -75,6 +75,10 @@ def test_whole2(self): test = CwlTranslator.translate_code_tool_internal(PythonEchoTool()) print(test) + def test_whole_cwl(self): + out = PythonEchoTool().translate("cwl", to_console=False) + print(out) + # def test_build_code_block(self): # script = PythonEchoTool().prepared_script() # print(script) @@ -112,10 +116,7 @@ def test_whole2(self): import argparse, json, sys from typing import Optional, List, Dict, Any cli = argparse.ArgumentParser("Argument parser for Janis PythonTool") -cli.add_argument("--name", type=str, required=True) -cli.add_argument("--infile", type=str, help='File to write to fout') -cli.add_argument("--flag", action='store_true', help='Random boolean') -cli.add_argument("--testvalue", type=str) +cli.add_argument("--json", help="JSON file to parse") String = str Filename = str @@ -152,7 +153,9 @@ def code_block(name: str, infile: Filename, flag: bool = True, testvalue="test") try: args = cli.parse_args() - result = code_block(name=args.name, infile=args.infile, flag=args.flag, testvalue=args.testvalue) + with open(args.json) as fp: + d = json.load(fp) + result = code_block(**d) print(json.dumps(result)) except Exception as e: print(str(e), file=sys.stderr) @@ -160,10 +163,7 @@ def code_block(name: str, infile: Filename, flag: bool = True, testvalue="test") EOT python echo_tool-script.py \\ - --name '~{name}' \\ - --infile '~{select_first([infile, "generated"])}' \\ - ~{if defined(select_first([flag, true])) then "--flag" else ""} \\ - ~{if defined(select_first([testvalue, "test"])) then ("--testvalue '" + select_first([testvalue, "test"]) + "'") else ""} + --json ~{write_json({"name": name, "infile": infile, "flag": flag, "testvalue": testvalue})} >>> runtime { disks: runtime_disks diff --git a/janis_core/translations/cwl.py b/janis_core/translations/cwl.py index 688dc0a22..45fbce65c 100644 --- a/janis_core/translations/cwl.py +++ b/janis_core/translations/cwl.py @@ -682,21 +682,28 @@ def translate_code_tool_internal( inputs=[], outputs=[], requirements=[], + arguments=[], + ) + + tool_cwl.arguments.append( + cwlgen.CommandLineBinding(valueFrom="inputs.json", prefix="--json") ) + tool_ins = tool.inputs() + tool_cwl.inputs.extend( translate_tool_input( ToolInput( t.id(), input_type=t.intype, - prefix=f"--{t.id()}", + # prefix=f"--{t.id()}", default=t.default, doc=t.doc.doc if t.doc else None, ), inputsdict=inputsdict, tool=tool, ) - for t in tool.inputs() + for t in tool_ins ) for output in tool.tool_outputs(): @@ -724,13 +731,28 @@ def translate_code_tool_internal( ) ) + ins = "[" + ", ".join(f'"{k.id()}"' for k in tool_ins) + "]" + tool_cwl.requirements.append( cwlgen.InitialWorkDirRequirement( listing=[ cwlgen.Dirent( entryname=scriptname, entry=tool.prepared_script(SupportedTranslation.CWL), - ) + ), + cwlgen.Dirent( + entryname="inputs.json", + entry=f"""${{ +var retval = {{}}; +{ins}.forEach(function(k) {{ + if (inputs[k] != null && inputs[k].path) {{ + retval[k] = inputs[k].path; + }} else {{ + retval[k] = inputs[k]; + }} +}}) +return JSON.stringify(retval);\n}}""", + ), ] ) ) diff --git a/janis_core/translations/wdl.py b/janis_core/translations/wdl.py index bfcd395c0..7814d1269 100644 --- a/janis_core/translations/wdl.py +++ b/janis_core/translations/wdl.py @@ -436,7 +436,7 @@ def translate_code_tool_internal( f"numbers or an underscore)" ) - ins = cls.get_resource_override_inputs() + [ + raw_ins = [ ToolInput( t.id(), input_type=t.intype, @@ -447,6 +447,8 @@ def translate_code_tool_internal( for t in tool.tool_inputs() ] + ins = cls.get_resource_override_inputs() + raw_ins + tr_ins = cls.translate_tool_inputs(ins) outs = [] @@ -478,10 +480,18 @@ def translate_code_tool_internal( ) ) - command_ins = cls.build_command_from_inputs(ins) - bc = tool.base_command() - bcs = " ".join(bc) if isinstance(bc, list) else bc - commands.append(wdl.Task.Command(bcs, command_ins, [])) + prepared_map = ", ".join(f'"{i.id()}": {i.id()}' for i in raw_ins) + + tr_ins.append( + wdl.Input( + wdl.File, + "jsonFile__", + expression=f"write_json({{{prepared_map}}})", + requires_quotes=False, + ) + ) + command_ins = [wdl.Task.Command.CommandInput(f"--json '~{{jsonFile__}}'")] + commands.append(wdl.Task.Command(tool.base_command(), command_ins, [])) r = wdl.Task.Runtime() if with_docker: