From a69f55e0f18f8e45aa5d04f41fdce8805e7b9a72 Mon Sep 17 00:00:00 2001 From: Jiayong Li Date: Wed, 21 Jun 2017 10:30:05 -0400 Subject: [PATCH 1/5] Fix check_types when sinktype is Any and add tests --- cwltool/workflow.py | 19 ++++++++----------- tests/test_examples.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/cwltool/workflow.py b/cwltool/workflow.py index 2ad4badeb..5a4215df8 100644 --- a/cwltool/workflow.py +++ b/cwltool/workflow.py @@ -107,18 +107,15 @@ def check_types(srctype, sinktype, linkMerge, valueFrom): return "warning" else: return "exception" - else: - if not isinstance(sinktype, dict): - return "exception" - elif linkMerge == "merge_nested": - return check_types(srctype, sinktype["items"], None, None) - elif linkMerge == "merge_flattened": - if not isinstance(srctype, dict): - return check_types(srctype, sinktype["items"], None, None) - else: - return check_types(srctype, sinktype, None, None) + elif linkMerge == "merge_nested": + return check_types({"items": srctype, "type": "array"}, sinktype, None, None) + elif linkMerge == "merge_flattened": + if isinstance(srctype, dict) and srctype.get("type") == "array": + return check_types(srctype, sinktype, None, None) else: - raise WorkflowException(u"Unrecognized linkMerge enum '%s'" % linkMerge) + return check_types({"items": srctype, "type": "array"}, sinktype, None, None) + else: + raise WorkflowException(u"Unrecognized linkMerge enum '%s'" % linkMerge) def can_assign_src_to_sink(src, sink, strict=False): # type: (Any, Any, bool) -> bool diff --git a/tests/test_examples.py b/tests/test_examples.py index abaa5580e..f67b20dcf 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -420,6 +420,12 @@ def test_typecheck(self): linkMerge="merge_nested", valueFrom=None), "exception") + # check linkMerge: merge_nested and sinktype is "Any" + self.assertEquals(cwltool.workflow.check_types( + ['string', 'int'], "Any", + linkMerge="merge_nested", valueFrom=None), + "pass") + # check linkMerge: merge_flattened self.assertEquals(cwltool.workflow.check_types( ['string', 'int'], @@ -457,6 +463,17 @@ def test_typecheck(self): linkMerge="merge_flattened", valueFrom=None), "exception") + # check linkMerge: merge_flattened and sinktype is "Any" + self.assertEquals(cwltool.workflow.check_types( + ['string', 'int'], "Any", + linkMerge="merge_flattened", valueFrom=None), + "pass") + + self.assertEquals(cwltool.workflow.check_types( + {'items': ['string', 'int'], 'type': 'array'}, "Any", + linkMerge="merge_flattened", valueFrom=None), + "pass") + # check valueFrom self.assertEquals(cwltool.workflow.check_types( {'items': ['File', 'int'], 'type': 'array'}, From 3af956a451aaebdfd9e1a878c2467a2a90376684 Mon Sep 17 00:00:00 2001 From: Jiayong Li Date: Wed, 21 Jun 2017 10:40:25 -0400 Subject: [PATCH 2/5] Change error message from 'sink has linkMerge' to 'source has linkMerge' --- cwltool/workflow.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cwltool/workflow.py b/cwltool/workflow.py index 5a4215df8..337420176 100644 --- a/cwltool/workflow.py +++ b/cwltool/workflow.py @@ -575,7 +575,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs) " with sink '%s' of type %s" % (shortname(sink["id"]), json.dumps(sink["type"]))) if linkMerge: - msg += "\n" + SourceLine(sink).makeError(" sink has linkMerge method %s" % linkMerge) + msg += "\n" + SourceLine(sink).makeError(" source has linkMerge method %s" % linkMerge) warning_msgs.append(msg) for exception in exceptions: src = exception.src @@ -588,7 +588,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs) " with sink '%s' of type %s" % (shortname(sink["id"]), json.dumps(sink["type"]))) if linkMerge: - msg += "\n" + SourceLine(sink).makeError(" sink has linkMerge method %s" % linkMerge) + msg += "\n" + SourceLine(sink).makeError(" source has linkMerge method %s" % linkMerge) exception_msgs.append(msg) for sink in step_inputs: From 80c717b922724063deb69c48a6e5dabc0d140b4c Mon Sep 17 00:00:00 2001 From: Jiayong Li Date: Wed, 21 Jun 2017 10:49:52 -0400 Subject: [PATCH 3/5] Fix type --- cwltool/workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwltool/workflow.py b/cwltool/workflow.py index 337420176..189657427 100644 --- a/cwltool/workflow.py +++ b/cwltool/workflow.py @@ -94,7 +94,7 @@ def match_types(sinktype, src, iid, inputobj, linkMerge, valueFrom): def check_types(srctype, sinktype, linkMerge, valueFrom): - # type: (Union[List[Text],Text], Union[List[Text],Text], Text, Text) -> Text + # type: (Any, Any, Text, Text) -> Text """Check if the source and sink types are "pass", "warning", or "exception". """ From 9ca656307c6c77e69fe66987cf89d602f2955b89 Mon Sep 17 00:00:00 2001 From: Jiayong Li Date: Thu, 22 Jun 2017 17:41:47 -0400 Subject: [PATCH 4/5] Fix issue #437 and add test: check_types bug when linkMerge is merge_flattened and srctype is a list --- cwltool/workflow.py | 20 +++++++++++++++----- tests/test_examples.py | 7 +++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cwltool/workflow.py b/cwltool/workflow.py index 189657427..7e821fbfd 100644 --- a/cwltool/workflow.py +++ b/cwltool/workflow.py @@ -110,12 +110,22 @@ def check_types(srctype, sinktype, linkMerge, valueFrom): elif linkMerge == "merge_nested": return check_types({"items": srctype, "type": "array"}, sinktype, None, None) elif linkMerge == "merge_flattened": - if isinstance(srctype, dict) and srctype.get("type") == "array": - return check_types(srctype, sinktype, None, None) - else: - return check_types({"items": srctype, "type": "array"}, sinktype, None, None) + return check_types(merge_flatten_type(srctype), sinktype, None, None) + else: + raise WorkflowException(u"Unrecognized linkMerge enu_m '%s'" % linkMerge) + + +def merge_flatten_type(src): + # type: Any -> Any + """Return the merge flattened type of the source type + """ + + if isinstance(src, list): + return [merge_flatten_type(t) for t in src] + elif isinstance(src, dict) and src.get("type") == "array": + return src else: - raise WorkflowException(u"Unrecognized linkMerge enum '%s'" % linkMerge) + return {"items": src, "type": "array"} def can_assign_src_to_sink(src, sink, strict=False): # type: (Any, Any, bool) -> bool diff --git a/tests/test_examples.py b/tests/test_examples.py index f67b20dcf..7551712af 100644 --- a/tests/test_examples.py +++ b/tests/test_examples.py @@ -474,6 +474,13 @@ def test_typecheck(self): linkMerge="merge_flattened", valueFrom=None), "pass") + # check linkMerge: merge_flattened when srctype is a list + self.assertEquals(cwltool.workflow.check_types( + [{'items': 'string', 'type': 'array'}], + {'items': 'string', 'type': 'array'}, + linkMerge="merge_flattened", valueFrom=None), + "pass") + # check valueFrom self.assertEquals(cwltool.workflow.check_types( {'items': ['File', 'int'], 'type': 'array'}, From b5340b8eeaf67e9d0802cc1190ae4702ab664c61 Mon Sep 17 00:00:00 2001 From: Jiayong Li Date: Thu, 22 Jun 2017 17:51:23 -0400 Subject: [PATCH 5/5] Fix tox --- cwltool/workflow.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cwltool/workflow.py b/cwltool/workflow.py index 7e821fbfd..4130d7a25 100644 --- a/cwltool/workflow.py +++ b/cwltool/workflow.py @@ -116,7 +116,7 @@ def check_types(srctype, sinktype, linkMerge, valueFrom): def merge_flatten_type(src): - # type: Any -> Any + # type: (Any) -> Any """Return the merge flattened type of the source type """