Skip to content

Commit c464a11

Browse files
author
Peter Amstutz
committed
Symbol match on alphanumerics for parameter references instead of trying to
specify negative set.
1 parent f3490d3 commit c464a11

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

cwltool/expression.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ class DR(object):
8686

8787
raise WorkflowException("Unknown expression engine '%s'" % ex["engine"])
8888

89-
seg_symbol = r"""[^[\].(){} ]+"""
89+
seg_symbol = r"""\w+"""
9090
seg_single = r"""\['([^']|\\')+'\]"""
9191
seg_double = r"""\["([^"]|\\")+"\]"""
9292
seg_index = r"""\[[0-9]+\]"""
9393
segments = r"(\.%s|%s|%s|%s)" % (seg_symbol, seg_single, seg_double, seg_index)
94-
segment_re = re.compile(segments)
95-
param_re = re.compile(r"\$\((%s)%s*\)" % (seg_symbol, segments))
94+
segment_re = re.compile(segments, flags=re.UNICODE)
95+
param_re = re.compile(r"\$\((%s)%s*\)" % (seg_symbol, segments), flags=re.UNICODE)
9696

9797
def next_seg(remain, obj):
9898
if remain:
@@ -115,11 +115,13 @@ def param_interpolate(ex, obj, strip=True):
115115
if strip and len(ex.strip()) == len(m.group(0)):
116116
return leaf
117117
else:
118-
leaf = json.dumps(leaf)
118+
leaf = json.dumps(leaf, sort_keys=True)
119119
if leaf[0] == '"':
120120
leaf = leaf[1:-1]
121121
return ex[0:m.start(0)] + leaf + param_interpolate(ex[m.end(0):], obj, False)
122122
else:
123+
if "$(" in ex:
124+
_logger.warn("Possible bug: found '$(' in '%s' but did not match valid parameter reference.")
123125
return ex
124126

125127

cwltool/sandboxjs.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ def scanner(scan):
103103
else:
104104
return None
105105

106+
106107
def interpolate(scan, jslib):
107108
scan = scan.strip()
108109
parts = []
@@ -114,7 +115,10 @@ def interpolate(scan, jslib):
114115
e = execjs(scan[w[0]+1:w[1]], jslib)
115116
if w[0] == 0 and w[1] == len(scan):
116117
return e
117-
parts.append(json.dumps(e))
118+
leaf = json.dumps(e, sort_keys=True)
119+
if leaf[0] == '"':
120+
leaf = leaf[1:-1]
121+
parts.append(leaf)
118122
elif scan[w[0]] == '\\':
119123
e = scan[w[1]-1]
120124
parts.append(e)

tests/test_examples.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ def test_params(self):
1313
self.assertTrue(expr.param_re.match("$(foo['bar']['baz'])"))
1414
self.assertTrue(expr.param_re.match("$(foo['b\\'ar']['baz'])"))
1515
self.assertTrue(expr.param_re.match("$(foo['b ar']['baz'])"))
16+
self.assertTrue(expr.param_re.match("$(foo_bar)"))
1617

1718
self.assertFalse(expr.param_re.match("$(foo.[\"bar\"])"))
1819
self.assertFalse(expr.param_re.match("$(.foo[\"bar\"])"))
@@ -26,6 +27,8 @@ def test_params(self):
2627
self.assertFalse(expr.param_re.match("$foo.bar)"))
2728
self.assertFalse(expr.param_re.match("$foo.b ar)"))
2829
self.assertFalse(expr.param_re.match("$foo.b\'ar)"))
30+
self.assertFalse(expr.param_re.match("$(foo+bar"))
31+
self.assertFalse(expr.param_re.match("$(foo bar"))
2932

3033
inputs = {
3134
"foo": {

0 commit comments

Comments
 (0)