4042: expand list fix
[arvados.git] / crunch_scripts / run-command
index 8a9eb1ac0df4fe9fce58cbedcceba92ea28d6cb6..40fb7128b2558bc0e5ebe2d6063135f5513d1597 100755 (executable)
@@ -91,6 +91,12 @@ def expand_item(p, c):
                 params[var] = i
                 r.extend(expand_list(params, c["command"]))
             return r
+        if "list" in c and "index" in c and "command" in c:
+            var = c["list"]
+            items = get_items(p, p[var])
+            params = copy.copy(p)
+            params[var] = items[int(c["index"])]
+            return expand_list(params, c["command"])
     elif isinstance(c, list):
         return expand_list(p, c)
     elif isinstance(c, str) or isinstance(c, unicode):
@@ -99,30 +105,41 @@ def expand_item(p, c):
     return []
 
 def expand_list(p, l):
-    return [exp for arg in l for exp in expand_item(p, arg)]
+    if isinstance(l, basestring):
+        return [expand_item(p, l)]
+    else:
+        return [exp for arg in l for exp in expand_item(p, arg)]
 
 def add_to_group(gr, match):
-    m = ('^_^').join(match.groups()[1:])
+    m = ('^_^').join(match.groups())
     if m not in gr:
         gr[m] = []
-    gr[m].extend(match.group(0))
+    gr[m].append(match.group(0))
 
 def get_items(p, value):
     if isinstance(value, dict):
-        if "filter" in value and "regex" in value:
+        if "regex" in value:
             pattern = re.compile(value["regex"])
-            items = get_items(p, value["group"])
-            return [i for i in items if pattern.match(i)]
+            if "filter" in value:
+                items = get_items(p, value["filter"])
+                return [i for i in items if pattern.match(i)]
+            elif "group" in value:
+                items = get_items(p, value["group"])
+                groups = {}
+                for i in items:
+                    p = pattern.match(i)
+                    if p:
+                        add_to_group(groups, p)
+                return [groups[k] for k in groups]
+            elif "extract" in value:
+                items = get_items(p, value["extract"])
+                r = []
+                for i in items:
+                    p = pattern.match(i)
+                    if p:
+                        r.append(p.groups())
+                return r
 
-        if "group" in value and "regex" in value:
-            pattern = re.compile(value["regex"])
-            items = get_items(p, value["group"])
-            groups = {}
-            for i in items:
-                p = pattern.match(i)
-                if p:
-                    add_to_group(groups, p)
-            return [groups[k] for k in groups]
     if isinstance(value, list):
         return expand_list(p, value)