diff --git a/cwltool/pack.py b/cwltool/pack.py index b51d7ad56..898f5485b 100644 --- a/cwltool/pack.py +++ b/cwltool/pack.py @@ -157,4 +157,9 @@ def rewrite_id(r, mainuri): import_embed(packed, set()) + if len(packed["$graph"]) == 1: + # duplicate 'cwlVersion' inside $graph when there is a single item + # because we're printing contents inside '$graph' rather than whole dict + packed["$graph"][0]["cwlVersion"] = packed["cwlVersion"] + return packed diff --git a/tests/test_pack.py b/tests/test_pack.py index e49cd21e3..34a14e6d3 100644 --- a/tests/test_pack.py +++ b/tests/test_pack.py @@ -5,6 +5,7 @@ from functools import partial import cwltool.pack +from cwltool.main import print_pack as print_pack import cwltool.workflow from cwltool.load_tool import fetch_document, validate_document from cwltool.main import makeRelative @@ -33,3 +34,29 @@ def test_pack(self): del expect_packed["$schemas"] self.assertEqual(expect_packed, packed) + + def test_pack_missing_cwlVersion(self): + """Test to ensure the generated pack output is not missing + the `cwlVersion` in case of single tool workflow and single step workflow""" + # Since diff is longer than 3174 characters + self.maxDiff = None + + # Testing single tool workflow + document_loader, workflowobj, uri = fetch_document( + get_data("tests/wf/hello_single_tool.cwl")) + document_loader, avsc_names, processobj, metadata, uri = validate_document( + document_loader, workflowobj, uri) + # generate pack output dict + packed = json.loads(print_pack(document_loader, processobj, uri, metadata)) + + self.assertEqual('v1.0', packed["cwlVersion"]) + + # Testing single step workflow + document_loader, workflowobj, uri = fetch_document( + get_data("tests/wf/hello-workflow.cwl")) + document_loader, avsc_names, processobj, metadata, uri = validate_document( + document_loader, workflowobj, uri) + # generate pack output dict + packed = json.loads(print_pack(document_loader, processobj, uri, metadata)) + + self.assertEqual('v1.0', packed["cwlVersion"]) diff --git a/tests/wf/hello-workflow.cwl b/tests/wf/hello-workflow.cwl new file mode 100644 index 000000000..08c333bca --- /dev/null +++ b/tests/wf/hello-workflow.cwl @@ -0,0 +1,38 @@ +#!/usr/bin/env cwl-runner + +cwlVersion: v1.0 +class: Workflow + +label: "Hello World" +doc: "Outputs a message using echo" + +inputs: + usermessage: string + +outputs: + response: + outputSource: step0/response + type: File + +steps: + step0: + run: + class: CommandLineTool + inputs: + message: + type: string + doc: "The message to print" + default: "Hello World" + inputBinding: + position: 1 + baseCommand: echo + arguments: + - "-n" + - "-e" + stdout: response.txt + outputs: + response: + type: stdout + in: + message: usermessage + out: [response] \ No newline at end of file diff --git a/tests/wf/hello_single_tool.cwl b/tests/wf/hello_single_tool.cwl new file mode 100644 index 000000000..af0c4de29 --- /dev/null +++ b/tests/wf/hello_single_tool.cwl @@ -0,0 +1,9 @@ +cwlVersion: v1.0 +class: CommandLineTool +baseCommand: echo +inputs: + message: + type: string + inputBinding: + position: 1 +outputs: []