large refactoring, ready to move away from rally
diff --git a/scripts/data.py b/scripts/data.py
new file mode 100644
index 0000000..dfe97a2
--- /dev/null
+++ b/scripts/data.py
@@ -0,0 +1,115 @@
+import re
+import sys
+import json
+
+splitter_rr = "(?ms)=====+\n"
+
+
+def get_data_from_output(fname):
+    results = {}
+    fc = open(fname).read()
+
+    for block in re.split(splitter_rr, fc):
+        block = block.strip()
+        if not block.startswith("[{u'__meta__':"):
+            continue
+        for val in eval(block):
+            meta = val['__meta__']
+            meta['sync'] = 's' if meta['sync'] else 'a'
+            key = "{action} {sync} {blocksize}k".format(**meta)
+            results.setdefault(key, []).append(val['bw_mean'])
+
+    processed_res = {}
+
+    for k, v in results.items():
+        v.sort()
+        med = float(sum(v)) / len(v)
+        ran = sum(abs(x - med) for x in v) / len(v)
+        processed_res[k] = (int(med), int(ran))
+
+    return meta, processed_res
+
+
+def ksort(x):
+    op, sync, sz = x.split(" ")
+    return (op, sync, int(sz[:-1]))
+
+
+def create_json_results(meta, file_data):
+    row = {"build_id": "",
+           "type": "",
+           "iso_md5": ""}
+    row.update(file_data)
+    return json.dumps(row)
+
+
+def show_data(*pathes):
+    begin = "|  {:>10}  {:>5}  {:>5}"
+    first_file_templ = "  |  {:>6} ~ {:>5} {:>2}% {:>5}"
+    other_file_templ = "  |  {:>6} ~ {:>5} {:>2}% {:>5} ----  {:>6}%"
+
+    line_templ = begin + first_file_templ + \
+        other_file_templ * (len(pathes) - 1) + "  |"
+
+    header_ln = line_templ.replace("<", "^").replace(">", "^")
+
+    params = ["Oper", "Sync", "BSZ", "BW1", "DEV1", "%", "IOPS1"]
+    for pos in range(1, len(pathes)):
+        params += "BW{0}+DEV{0}+%+IOPS{0}+DIFF %".format(pos).split("+")
+
+    header_ln = header_ln.format(*params)
+
+    sep = '-' * len(header_ln)
+
+    results = [get_data_from_output(path)[1] for path in pathes]
+
+    print sep
+    print header_ln
+    print sep
+
+    prev_tp = None
+
+    common_keys = set(results[0].keys())
+    for result in results[1:]:
+        common_keys &= set(result.keys())
+
+    for k in sorted(common_keys, key=ksort):
+        tp = k.rsplit(" ", 1)[0]
+        op, s, sz = k.split(" ")
+        s = 'sync' if s == 's' else 'async'
+
+        if tp != prev_tp and prev_tp is not None:
+            print sep
+
+        prev_tp = tp
+
+        results0 = results[0]
+        m0, d0 = results0[k]
+        iops0 = m0 / int(sz[:-1])
+        perc0 = int(d0 * 100.0 / m0 + 0.5)
+
+        data = [op, s, sz, m0, d0, perc0, iops0]
+
+        for result in results[1:]:
+            m, d = result[k]
+            iops = m / int(sz[:-1])
+            perc = int(d * 100.0 / m + 0.5)
+            avg_diff = int(((m - m0) * 100.) / m + 0.5)
+            data.extend([m, d, perc, iops, avg_diff])
+
+        print line_templ.format(*data)
+
+    print sep
+
+
+def main(argv):
+    path1 = argv[0]
+    if path1 == '--json':
+        print create_json_results(*get_data_from_output(argv[1]))
+    else:
+        show_data(*argv)
+    return 0
+
+if __name__ == "__main__":
+    exit(main(sys.argv[1:]))
+# print " ", results[k]