Skip to content

Commit c5175f4

Browse files
lijiayongtetron
authored andcommitted
10827 static checker fix (#435)
* Fix check_types when sinktype is Any and add tests * Change error message from 'sink has linkMerge' to 'source has linkMerge' * Fix issue #437 and add test: check_types bug when linkMerge is merge_flattened and srctype is a list
1 parent ce7b293 commit c5175f4

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

cwltool/workflow.py

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ def match_types(sinktype, src, iid, inputobj, linkMerge, valueFrom):
9797

9898

9999
def check_types(srctype, sinktype, linkMerge, valueFrom):
100-
# type: (Union[List[Text],Text], Union[List[Text],Text], Text, Text) -> Text
100+
# type: (Any, Any, Text, Text) -> Text
101101
"""Check if the source and sink types are "pass", "warning", or "exception".
102102
"""
103103

@@ -110,18 +110,25 @@ def check_types(srctype, sinktype, linkMerge, valueFrom):
110110
return "warning"
111111
else:
112112
return "exception"
113+
elif linkMerge == "merge_nested":
114+
return check_types({"items": srctype, "type": "array"}, sinktype, None, None)
115+
elif linkMerge == "merge_flattened":
116+
return check_types(merge_flatten_type(srctype), sinktype, None, None)
113117
else:
114-
if not isinstance(sinktype, dict):
115-
return "exception"
116-
elif linkMerge == "merge_nested":
117-
return check_types(srctype, sinktype["items"], None, None)
118-
elif linkMerge == "merge_flattened":
119-
if not isinstance(srctype, dict):
120-
return check_types(srctype, sinktype["items"], None, None)
121-
else:
122-
return check_types(srctype, sinktype, None, None)
123-
else:
124-
raise WorkflowException(u"Unrecognized linkMerge enum '%s'" % linkMerge)
118+
raise WorkflowException(u"Unrecognized linkMerge enu_m '%s'" % linkMerge)
119+
120+
121+
def merge_flatten_type(src):
122+
# type: (Any) -> Any
123+
"""Return the merge flattened type of the source type
124+
"""
125+
126+
if isinstance(src, list):
127+
return [merge_flatten_type(t) for t in src]
128+
elif isinstance(src, dict) and src.get("type") == "array":
129+
return src
130+
else:
131+
return {"items": src, "type": "array"}
125132

126133

127134
def can_assign_src_to_sink(src, sink, strict=False): # type: (Any, Any, bool) -> bool
@@ -581,7 +588,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs)
581588
" with sink '%s' of type %s"
582589
% (shortname(sink["id"]), json.dumps(sink["type"])))
583590
if linkMerge:
584-
msg += "\n" + SourceLine(sink).makeError(" sink has linkMerge method %s" % linkMerge)
591+
msg += "\n" + SourceLine(sink).makeError(" source has linkMerge method %s" % linkMerge)
585592
warning_msgs.append(msg)
586593
for exception in exceptions:
587594
src = exception.src
@@ -594,7 +601,7 @@ def static_checker(workflow_inputs, workflow_outputs, step_inputs, step_outputs)
594601
" with sink '%s' of type %s"
595602
% (shortname(sink["id"]), json.dumps(sink["type"])))
596603
if linkMerge:
597-
msg += "\n" + SourceLine(sink).makeError(" sink has linkMerge method %s" % linkMerge)
604+
msg += "\n" + SourceLine(sink).makeError(" source has linkMerge method %s" % linkMerge)
598605
exception_msgs.append(msg)
599606

600607
for sink in step_inputs:

tests/test_examples.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,12 @@ def test_typecheck(self):
421421
linkMerge="merge_nested", valueFrom=None),
422422
"exception")
423423

424+
# check linkMerge: merge_nested and sinktype is "Any"
425+
self.assertEquals(cwltool.workflow.check_types(
426+
['string', 'int'], "Any",
427+
linkMerge="merge_nested", valueFrom=None),
428+
"pass")
429+
424430
# check linkMerge: merge_flattened
425431
self.assertEquals(cwltool.workflow.check_types(
426432
['string', 'int'],
@@ -458,6 +464,24 @@ def test_typecheck(self):
458464
linkMerge="merge_flattened", valueFrom=None),
459465
"exception")
460466

467+
# check linkMerge: merge_flattened and sinktype is "Any"
468+
self.assertEquals(cwltool.workflow.check_types(
469+
['string', 'int'], "Any",
470+
linkMerge="merge_flattened", valueFrom=None),
471+
"pass")
472+
473+
self.assertEquals(cwltool.workflow.check_types(
474+
{'items': ['string', 'int'], 'type': 'array'}, "Any",
475+
linkMerge="merge_flattened", valueFrom=None),
476+
"pass")
477+
478+
# check linkMerge: merge_flattened when srctype is a list
479+
self.assertEquals(cwltool.workflow.check_types(
480+
[{'items': 'string', 'type': 'array'}],
481+
{'items': 'string', 'type': 'array'},
482+
linkMerge="merge_flattened", valueFrom=None),
483+
"pass")
484+
461485
# check valueFrom
462486
self.assertEquals(cwltool.workflow.check_types(
463487
{'items': ['File', 'int'], 'type': 'array'},

0 commit comments

Comments
 (0)