diff env/lib/python3.9/site-packages/galaxy/containers/docker_decorators.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/env/lib/python3.9/site-packages/galaxy/containers/docker_decorators.py	Mon Mar 22 18:12:50 2021 +0000
@@ -0,0 +1,54 @@
+"""
+Decorators for docker
+"""
+import json
+from functools import wraps
+
+
+def docker_columns(f):
+    @wraps(f)
+    def parse_docker_column_output(*args, **kwargs):
+        """Many docker commands do not provide an option to format the output
+        or output in a machine-readily-parseable format (e.g. json). In order
+        to deal with such output and hopefully stay compatible with future
+        column order changes, key returned rows based on column headers.
+
+        An assumption is made that a single space in the header row does not
+        separate columns - column names can have spaces in them, and columns
+        are separated by at least 2 spaces. This seems to be true as of Docker
+        1.13.1.
+        """
+        output = f(*args, **kwargs)
+        parsed = []
+        output = output.splitlines()
+        header = output[0]
+        colstarts = [0]
+        colidx = 0
+        spacect = 0
+        if not output:
+            return parsed
+        for i, c in enumerate(header):
+            if c != ' ' and spacect > 1:
+                colidx += 1
+                colstarts.append(i)
+                spacect = 0
+            elif c == ' ':
+                spacect += 1
+        colstarts.append(None)
+        colheadings = []
+        for i in range(0, len(colstarts) - 1):
+            colheadings.append(header[colstarts[i]:colstarts[i + 1]].strip())
+        for line in output[1:]:
+            row = {}
+            for i, key in enumerate(colheadings):
+                row[key] = line[colstarts[i]:colstarts[i + 1]].strip()
+            parsed.append(row)
+        return parsed
+    return parse_docker_column_output
+
+
+def docker_json(f):
+    @wraps(f)
+    def json_loads(*args, **kwargs):
+        return json.loads(f(*args, **kwargs))
+    return json_loads