)]}'
{"tools/top_timings.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"__author__ \u003d \u0027wznoinsk\u0027"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import argparse"},{"line_number":6,"context_line":"from operator import itemgetter"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_8131a10d","line":3,"updated":"2015-11-23 19:34:29.000000000","message":"I\u0027m pretty sure people don\u0027t use this anymore and it should be Intel anyway. Where\u0027s the license?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"__author__ \u003d \u0027wznoinsk\u0027"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import argparse"},{"line_number":6,"context_line":"from operator import itemgetter"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_d646864e","line":3,"in_reply_to":"ba8a016a_8131a10d","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"__author__ \u003d \u0027wznoinsk\u0027"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import argparse"},{"line_number":6,"context_line":"from operator import itemgetter"},{"line_number":7,"context_line":"import datetime"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_6ba25e4d","line":4,"updated":"2015-11-23 19:05:13.000000000","message":"run pep8/flake8 before posting files for review.","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"__author__ \u003d \u0027wznoinsk\u0027"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"import argparse"},{"line_number":6,"context_line":"from operator import itemgetter"},{"line_number":7,"context_line":"import datetime"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_75cd53b6","line":4,"in_reply_to":"ba8a016a_6ba25e4d","updated":"2015-11-23 23:08:29.000000000","message":"it looks intelliJ didn\u0027t catch all, now ran with tox/flake8 and fixed some nits","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":6,"context_line":"from operator import itemgetter"},{"line_number":7,"context_line":"import datetime"},{"line_number":8,"context_line":"import sys"},{"line_number":9,"context_line":"import time"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"run_modes \u003d [\"line\"]"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_4112d963","line":9,"updated":"2015-11-23 19:34:29.000000000","message":"These are all out of order. PEP8?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"from operator import itemgetter"},{"line_number":7,"context_line":"import datetime"},{"line_number":8,"context_line":"import sys"},{"line_number":9,"context_line":"import time"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"run_modes \u003d [\"line\"]"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_96779e9e","line":9,"in_reply_to":"ba8a016a_4112d963","updated":"2015-11-23 23:08:29.000000000","message":"Done PEP8 via tox/flake8, wasn\u0027t complaining about the order tho","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":14,"context_line":"def parse_options():"},{"line_number":15,"context_line":"    parser \u003d argparse.ArgumentParser()"},{"line_number":16,"context_line":"    parser.add_argument(\u0027--dir\u0027, help\u003d\"Location of devstack\u0027s log file(s)\","},{"line_number":17,"context_line":"                        required\u003dTrue, dest\u003d\"indir\")"},{"line_number":18,"context_line":"    return parser.parse_args()"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_c1e569a8","line":17,"updated":"2015-11-23 19:34:29.000000000","message":"Would it be helpful to accept a file via \u0027stdin\u0027? Also - why do you ask for the path to the containing directory instead of the path to the file?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":14,"context_line":"def parse_options():"},{"line_number":15,"context_line":"    parser \u003d argparse.ArgumentParser()"},{"line_number":16,"context_line":"    parser.add_argument(\u0027--dir\u0027, help\u003d\"Location of devstack\u0027s log file(s)\","},{"line_number":17,"context_line":"                        required\u003dTrue, dest\u003d\"indir\")"},{"line_number":18,"context_line":"    return parser.parse_args()"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_9cbd7fd9","line":17,"in_reply_to":"ba8a016a_c1e569a8","updated":"2015-11-23 23:08:29.000000000","message":"good idea, added TODO comment for that, tbd in the future\n\non --dir - I was planning to support multiple xstack*log files hence the directory, changed to --file, --dir may be another option altogether in the future","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    return parser.parse_args()"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def open_infile(indir\u003d\".\"):"},{"line_number":22,"context_line":"    infile \u003d \"%s/xstack.sh.log\" % indir"},{"line_number":23,"context_line":"    return open(infile, \u0027r\u0027)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_01dcd1e2","line":21,"updated":"2015-11-23 19:34:29.000000000","message":"Get rid of this and use a context manger (i.e. `with` statement)","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    return parser.parse_args()"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def open_infile(indir\u003d\".\"):"},{"line_number":22,"context_line":"    infile \u003d \"%s/xstack.sh.log\" % indir"},{"line_number":23,"context_line":"    return open(infile, \u0027r\u0027)"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_f6ddca70","line":21,"in_reply_to":"ba8a016a_01dcd1e2","updated":"2015-11-23 23:08:29.000000000","message":"done with oneline open/readlines()","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    return open(infile, \u0027r\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def prepopulate_list(s):"},{"line_number":27,"context_line":"    l \u003d []"},{"line_number":28,"context_line":"    for i in range(0, s):"},{"line_number":29,"context_line":"        l.append(0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_4bb67a8b","line":26,"updated":"2015-11-23 19:05:13.000000000","message":"this function is more simply written as:\n\n    return [0] * s","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    return open(infile, \u0027r\u0027)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def prepopulate_list(s):"},{"line_number":27,"context_line":"    l \u003d []"},{"line_number":28,"context_line":"    for i in range(0, s):"},{"line_number":29,"context_line":"        l.append(0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_b5bdfbd8","line":26,"in_reply_to":"ba8a016a_4bb67a8b","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def calc_delta(line_prev, line):"},{"line_number":35,"context_line":"    fields \u003d line_prev.split(\"|\")"},{"line_number":36,"context_line":"    dt \u003d datetime.datetime.strptime(fields[0].strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":37,"context_line":"    msecs_prev \u003d float(time.mktime(dt.timetuple())) + (float(dt.microsecond)"},{"line_number":38,"context_line":"                                                       / 1000000)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_0b5f1242","line":35,"updated":"2015-11-23 19:05:13.000000000","message":"split takes a number limiting the number of splits. You could limit this to 1 and just do:\n\n    field, _ \u003d line_prev.split(\"|\", 1)\n    field \u003d field.strip()","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def calc_delta(line_prev, line):"},{"line_number":35,"context_line":"    fields \u003d line_prev.split(\"|\")"},{"line_number":36,"context_line":"    dt \u003d datetime.datetime.strptime(fields[0].strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":37,"context_line":"    msecs_prev \u003d float(time.mktime(dt.timetuple())) + (float(dt.microsecond)"},{"line_number":38,"context_line":"                                                       / 1000000)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_550ccf93","line":35,"in_reply_to":"ba8a016a_0b5f1242","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    dt \u003d datetime.datetime.strptime(fields[0].strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":42,"context_line":"    msecs \u003d float(time.mktime(dt.timetuple())) + (float(dt.microsecond)"},{"line_number":43,"context_line":"                                                  / 1000000)"},{"line_number":44,"context_line":"    if msecs_prev \u003e 0:"},{"line_number":45,"context_line":"        delta \u003d msecs - msecs_prev"},{"line_number":46,"context_line":"    else:"},{"line_number":47,"context_line":"        delta \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_ab34c6fa","line":44,"updated":"2015-11-23 19:05:13.000000000","message":"Since these two stanzas repeat why not make helper functions like you did for other sections?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    dt \u003d datetime.datetime.strptime(fields[0].strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":42,"context_line":"    msecs \u003d float(time.mktime(dt.timetuple())) + (float(dt.microsecond)"},{"line_number":43,"context_line":"                                                  / 1000000)"},{"line_number":44,"context_line":"    if msecs_prev \u003e 0:"},{"line_number":45,"context_line":"        delta \u003d msecs - msecs_prev"},{"line_number":46,"context_line":"    else:"},{"line_number":47,"context_line":"        delta \u003d 0"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_b515fb9b","line":44,"in_reply_to":"ba8a016a_ab34c6fa","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return delta"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def merge_deltas(deltas):"},{"line_number":53,"context_line":"    deltas_out \u003d {}"},{"line_number":54,"context_line":"    for key in deltas.keys():"},{"line_number":55,"context_line":"        for key2, value2 in deltas[key].items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_ee189c77","line":52,"updated":"2015-11-23 19:05:13.000000000","message":"This function is not called. If you need it, check out \u0027dict.update\u0027 as likely as better way to write it.","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    return delta"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"def merge_deltas(deltas):"},{"line_number":53,"context_line":"    deltas_out \u003d {}"},{"line_number":54,"context_line":"    for key in deltas.keys():"},{"line_number":55,"context_line":"        for key2, value2 in deltas[key].items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_951237b3","line":52,"in_reply_to":"ba8a016a_ee189c77","updated":"2015-11-23 23:08:29.000000000","message":"accidentally left here, part of future development (WIP) of the script, removed","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            line_no +\u003d 1"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if mode \u003d\u003d \u0027line\u0027:"},{"line_number":76,"context_line":"            line_deltas_sorted \u003d sorted(deltas.items(),"},{"line_number":77,"context_line":"                                        key\u003ditemgetter(1), reverse\u003dTrue)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_8e823051","line":75,"updated":"2015-11-23 19:05:13.000000000","message":"This function does all of this work but mode might not be equal to \u0027line\u0027 so it will return nothing? Simplify this logic some.","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            line_no +\u003d 1"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if mode \u003d\u003d \u0027line\u0027:"},{"line_number":76,"context_line":"            line_deltas_sorted \u003d sorted(deltas.items(),"},{"line_number":77,"context_line":"                                        key\u003ditemgetter(1), reverse\u003dTrue)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_d5e51fa8","line":75,"in_reply_to":"ba8a016a_8e823051","updated":"2015-11-23 23:08:29.000000000","message":"currently only \"line\" mode of analysing times is supported, there will be more in the future (possibly supporting how long yum took etc.), now supported on the command line via arg parsing, defaulting to \"line\"","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    return line_deltas_sorted"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def display_top(deltas_sorted, lines):"},{"line_number":83,"context_line":"    c \u003d -1"},{"line_number":84,"context_line":"    for d in deltas_sorted:"},{"line_number":85,"context_line":"        c +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_6ef6ecfa","line":82,"updated":"2015-11-23 19:05:13.000000000","message":"Why is this hard coded to 10?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    return line_deltas_sorted"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"def display_top(deltas_sorted, lines):"},{"line_number":83,"context_line":"    c \u003d -1"},{"line_number":84,"context_line":"    for d in deltas_sorted:"},{"line_number":85,"context_line":"        c +\u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_f0b4f135","line":82,"in_reply_to":"ba8a016a_6ef6ecfa","updated":"2015-11-23 23:08:29.000000000","message":"now supported via arg parsing, defaulting to 10","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if c \u003c 10:"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                line_no \u003d d[0]"},{"line_number":89,"context_line":"                print \"%s sec | %s\" % ("},{"line_number":90,"context_line":"                    deltas_sorted[c][1], lines[line_no].strip())"},{"line_number":91,"context_line":"            except:"},{"line_number":92,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_a14dc59a","line":89,"updated":"2015-11-23 19:34:29.000000000","message":"I would like to have the subsituted padded to a certain length and aligned, such that I can easily compare values of different length.","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if c \u003c 10:"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                line_no \u003d d[0]"},{"line_number":89,"context_line":"                print \"%s sec | %s\" % ("},{"line_number":90,"context_line":"                    deltas_sorted[c][1], lines[line_no].strip())"},{"line_number":91,"context_line":"            except:"},{"line_number":92,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_56d4d6bb","line":89,"in_reply_to":"ba8a016a_a14dc59a","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def main():"},{"line_number":96,"context_line":"    cmdline_args \u003d parse_options()"},{"line_number":97,"context_line":"    infile_fh \u003d open_infile(cmdline_args.indir)"},{"line_number":98,"context_line":"    lines \u003d infile_fh.readlines()"},{"line_number":99,"context_line":"    line_deltas \u003d process_lines(lines)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_ee673cb5","line":97,"updated":"2015-11-23 19:05:13.000000000","message":"Use a \u0027with\u0027 statement for clarity and simplicity.\n\n    with open_infile(cmdline_args.indir) as fp:\n        lines \u003d fp.readlines()\n\n    line_deltas \u003d process_lines(lines)\n\nor simply:\n\n    lines \u003d open_infile(cmdline_args.indir).readlines()","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def main():"},{"line_number":96,"context_line":"    cmdline_args \u003d parse_options()"},{"line_number":97,"context_line":"    infile_fh \u003d open_infile(cmdline_args.indir)"},{"line_number":98,"context_line":"    lines \u003d infile_fh.readlines()"},{"line_number":99,"context_line":"    line_deltas \u003d process_lines(lines)"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_105f3542","line":97,"in_reply_to":"ba8a016a_ee673cb5","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23ed25ce9783579a3c0eb9e76aae75e4934a9768","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    lines \u003d infile_fh.readlines()"},{"line_number":99,"context_line":"    line_deltas \u003d process_lines(lines)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    print \"top 10 longest running commands\""},{"line_number":102,"context_line":"    display_top(line_deltas, lines)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    infile_fh.close()"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_e18e6dcf","line":101,"updated":"2015-11-23 19:34:29.000000000","message":"This isn\u0027t Python3 compatible. I think it should be. Did you run tox targets?","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    lines \u003d infile_fh.readlines()"},{"line_number":99,"context_line":"    line_deltas \u003d process_lines(lines)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    print \"top 10 longest running commands\""},{"line_number":102,"context_line":"    display_top(line_deltas, lines)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    infile_fh.close()"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_799b0dca","line":101,"in_reply_to":"ba8a016a_e18e6dcf","updated":"2015-11-23 23:08:29.000000000","message":"tox py27 and py34 good","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"7d1e71de4b5f216ad5977090e2abb03fcdc78312","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    print \"top 10 longest running commands\""},{"line_number":102,"context_line":"    display_top(line_deltas, lines)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    infile_fh.close()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_2ef544ca","line":104,"updated":"2015-11-23 19:05:13.000000000","message":"Don\u0027t need this if you clean up the code as suggested.","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"53d9bf87055b9c2adfc94daec1f5e7ae65cddfa1","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    print \"top 10 longest running commands\""},{"line_number":102,"context_line":"    display_top(line_deltas, lines)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    infile_fh.close()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba8a016a_305a7951","line":104,"in_reply_to":"ba8a016a_2ef544ca","updated":"2015-11-23 23:08:29.000000000","message":"Done","commit_id":"5e46c9e4079c83318cb80216f6a5260c4da1485d"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":17,"context_line":"# under the License."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import argparse"},{"line_number":20,"context_line":"from operator import itemgetter"},{"line_number":21,"context_line":"import datetime"},{"line_number":22,"context_line":"import sys"},{"line_number":23,"context_line":"import time"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_8063cd40","line":20,"updated":"2015-11-24 04:50:40.000000000","message":"Please keep alpabetic order.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    return open(infile, \u0027r\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def prepopulate_list(s):"},{"line_number":45,"context_line":"    return [0] * s"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_f384f1b1","line":44,"updated":"2015-11-24 04:50:40.000000000","message":"This is not used.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        (float(dt.microsecond) / 1000000)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def calc_delta(line_prev, line):"},{"line_number":56,"context_line":"    msecs_prev \u003d extract_msecs(line_prev)"},{"line_number":57,"context_line":"    msecs \u003d extract_msecs(line)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_53313d0a","line":55,"updated":"2015-11-24 04:50:40.000000000","message":"You are extracting msecs two times for each line because you are trying to perform everything in one loop. This is a C++/Java approach that takes huge ovverreads on python.\n\nInstead organize your algorithm in a sequence of operations over lists. Code becomes easier to follow, maintain and optimize.\n\nBelow I have left you an example that uses really few lines of code.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"362bd86b59d035d3cdfc3d1c531580ff534a2446","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def calc_delta(line_prev, line):"},{"line_number":56,"context_line":"    msecs_prev \u003d extract_msecs(line_prev)"},{"line_number":57,"context_line":"    msecs \u003d extract_msecs(line)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if msecs_prev \u003e 0:"},{"line_number":60,"context_line":"        delta \u003d msecs - msecs_prev"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_3f09e52c","line":57,"updated":"2015-11-23 23:32:12.000000000","message":"Only need msecs if msecs_prev is \u003e 0, move this under the if.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    msecs_prev \u003d extract_msecs(line_prev)"},{"line_number":57,"context_line":"    msecs \u003d extract_msecs(line)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    if msecs_prev \u003e 0:"},{"line_number":60,"context_line":"        delta \u003d msecs - msecs_prev"},{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        delta \u003d 0"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_13fe556b","line":59,"updated":"2015-11-24 04:50:40.000000000","message":"You can do this:\n\n   return max(0., msecs - msecs_prev)","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    if msecs_prev \u003e 0:"},{"line_number":60,"context_line":"        delta \u003d msecs - msecs_prev"},{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        delta \u003d 0"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    return delta"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_d3f8cd7e","line":62,"updated":"2015-11-24 04:50:40.000000000","message":"This is not a floating point. Writes instead 0. or 0.0","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    line_deltas_sorted \u003d {}"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    for mode in runmodes:"},{"line_number":71,"context_line":"        deltas \u003d {}"},{"line_number":72,"context_line":"        line_no \u003d 0"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        for line in lines:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_b3b98917","line":71,"updated":"2015-11-24 04:50:40.000000000","message":"Use a list instead of a dictionary if keys are a continuous sequence of integers.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"362bd86b59d035d3cdfc3d1c531580ff534a2446","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        deltas \u003d {}"},{"line_number":72,"context_line":"        line_no \u003d 0"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        for line in lines:"},{"line_number":75,"context_line":"            if line_no \u003e 0:"},{"line_number":76,"context_line":"                if mode \u003d\u003d \u0027line\u0027:"},{"line_number":77,"context_line":"                    deltas[line_no - 1] \u003d calc_delta(lines[line_no - 1], line)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_3f6ec5c9","line":74,"updated":"2015-11-23 23:32:12.000000000","message":"why not do:\n\n    line_no \u003d 1\n    for line in lines[1:]:\n        # process line\n\nThis saves you the check against line_no which fails for every line after the first one.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        deltas \u003d {}"},{"line_number":72,"context_line":"        line_no \u003d 0"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        for line in lines:"},{"line_number":75,"context_line":"            if line_no \u003e 0:"},{"line_number":76,"context_line":"                if mode \u003d\u003d \u0027line\u0027:"},{"line_number":77,"context_line":"                    deltas[line_no - 1] \u003d calc_delta(lines[line_no - 1], line)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_40eba578","line":74,"in_reply_to":"ba8a016a_3f6ec5c9","updated":"2015-11-24 04:50:40.000000000","message":"For storing a sequence of indexed numbers I prefer using lists than dictionaries. Arrays are easier and quite more efficient to manage than hashmaps for sequential operations.\n\nFor signal processing I love using numpy arays, but as it doesn\u0027t look like it is a suitable dependency you can use slicing for this things.\n\nAbout sequence slicing you can read this:\n\nhttp://stackoverflow.com/questions/509211/explain-pythons-slice-notation\n\nHere you can do it following your approach:\n  if mode \u003d\u003d \u0027line\u0027:\n    deltas \u003d [\n       calc_delta(line0, line1)\n       for line0, line1 in itertools.izip(lines[0:], lines[1:])]\n\nAs general rule I would prefer to pre-process lines and extract two lists from there (one for floating point info and the other for some metadata, like commands). Below code is easier to read and undestand:\n\n  if mode \u003d\u003d \u0027line\u0027:\n    time \u003d extract_timestamps_from_lines(lines)\n    deltas \u003d [time[i + 1] - time[i] for i in range(len(time) -1)]\n\nxrange returns a incremental sequence of integers: [0, 1, 2, 3 ...]","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"362bd86b59d035d3cdfc3d1c531580ff534a2446","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            line_no +\u003d 1"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        if mode \u003d\u003d \u0027line\u0027:"},{"line_number":82,"context_line":"            line_deltas_sorted \u003d sorted(deltas.items(),"},{"line_number":83,"context_line":"                                        key\u003ditemgetter(1), reverse\u003dTrue)"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_9f9ed1b6","line":81,"updated":"2015-11-23 23:32:12.000000000","message":"I am still not sold on the way modes are being handled. As you add more this loop will just get more and more complicated. Why not process_lines() then process_other_kind()?","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            line_no +\u003d 1"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        if mode \u003d\u003d \u0027line\u0027:"},{"line_number":82,"context_line":"            line_deltas_sorted \u003d sorted(deltas.items(),"},{"line_number":83,"context_line":"                                        key\u003ditemgetter(1), reverse\u003dTrue)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    return line_deltas_sorted"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_93db251b","line":82,"updated":"2015-11-24 04:50:40.000000000","message":"Assuming that you have a list of lines and a list of deltas ad you want to return which lines are the ones with bigger deltas. You should return a sequence of list indexes that sort lines by deltas.\n\nHere your sub function that process lines in 3 lines of code:\n\ndef sort_lines_by_delta(lines, mode):\n      times \u003d [extract_msecs(line) for line in lines]\n      deltas \u003d [max(0, times[i + 1] - times[i]) for i in range(len(time) -1)]\n      return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]\n\n\nYou ca use returned sequence in this way:\n  \n   sorted_lines \u003d [lines[i] for i in sort_lines_by_deltas(lines)]","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"362bd86b59d035d3cdfc3d1c531580ff534a2446","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    print \"top %s longest running commands\" % toplimit"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    c \u003d -1"},{"line_number":92,"context_line":"    fmt2 \u003d 6"},{"line_number":93,"context_line":"    fmt1 \u003d str(int(line_deltas[0][1])).__len__() + 4 + 6 + fmt2"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    while c \u003c toplimit - 1:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_bfe7153f","line":92,"updated":"2015-11-23 23:32:12.000000000","message":"magic numbers frowned on. This section reads like old style C code. Surely there is a cleaner way to do this? We are not processing 10 million lines with a requirement to do it in under 3 milliseconds.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    print \"top %s longest running commands\" % toplimit"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    c \u003d -1"},{"line_number":92,"context_line":"    fmt2 \u003d 6"},{"line_number":93,"context_line":"    fmt1 \u003d str(int(line_deltas[0][1])).__len__() + 4 + 6 + fmt2"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    while c \u003c toplimit - 1:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_9377a501","line":92,"in_reply_to":"ba8a016a_bfe7153f","updated":"2015-11-24 04:50:40.000000000","message":"If requirements are so high please use numpy or pandas. Are intended for this kind of works. In the office I can give you a short lesson. I am agree with Sean.\n\nBy the way in your code separate data processing from visualization. It becomes everything easier to read and maintain.\n\nAcquire data -\u003e Analyze/process data -\u003e Select interesting data -\u003e Produce the report\n\nPython is a slow language and you have to be carefull how you organize operations and data model. Dictionaries are really slow when processing big data. Python ones are optimized for small mappings. For big data use lists or (better) native arrays as numpy arrays or similar.","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17377,"name":"Federico Ressi","email":"federico.ressi@intel.com","username":"fressi"},"change_message_id":"380ce573f46eb337294a8cb6155c2fa5634f113e","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    cmdline_args \u003d parse_options()"},{"line_number":109,"context_line":"    # TODO(wznoinsk): add support for input from stdin"},{"line_number":110,"context_line":"    lines \u003d open_infile(cmdline_args.infile).readlines()"},{"line_number":111,"context_line":"    line_deltas \u003d process_lines(lines, [cmdline_args.runmodes])"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    display_top(line_deltas, lines, int(cmdline_args.toplimit))"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba8a016a_93fc853f","line":111,"updated":"2015-11-24 04:50:40.000000000","message":"run-modes is a list of commands. Process them separately instead of inside a big function that does everything.\n\n   for mode in modes:\n     if mode \u003d\u003d \u0027line\u0027\n        lines_by_deltas \u003d [lines[i] for i in sort_lines_by_deltas(lines)[:cmdline_args.toplimit]]","commit_id":"ba724f81612dc027b521598a76072bfe07119d55"},{"author":{"_account_id":17627,"name":"Václav Hejral","email":"vaclavx.hejral@intel.com","username":"vhejral"},"change_message_id":"61274a67ee3419b77229dee5bd8e4fe6e1a71de4","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def extract_msecs(line):"},{"line_number":49,"context_line":"    field, _ \u003d line.split(\"|\", 1)"},{"line_number":50,"context_line":"    dt \u003d datetime.datetime.strptime(field.strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":51,"context_line":"    return float(time.mktime(dt.timetuple())) + \\"},{"line_number":52,"context_line":"        (float(dt.microsecond) / 1000000)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a8ffd7b_df223e01","line":49,"updated":"2015-11-25 14:21:40.000000000","message":"nice script!\n\nxstack.sh.log contains also lines without pipe character, empty lines etc, and there this script fails with\n\nValueError: need more than 1 value to unpack","commit_id":"173b7560b4e1f820115328cd01a74512e15c6dd0"},{"author":{"_account_id":14287,"name":"Waldemar Znoinski","email":"wznoinsk@redhat.com","username":"wznoinsk"},"change_message_id":"13133d92a46b06323c78a5f1c3330ec4034dbb30","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def extract_msecs(line):"},{"line_number":49,"context_line":"    field, _ \u003d line.split(\"|\", 1)"},{"line_number":50,"context_line":"    dt \u003d datetime.datetime.strptime(field.strip(), \"%Y-%m-%d %H:%M:%S.%f\")"},{"line_number":51,"context_line":"    return float(time.mktime(dt.timetuple())) + \\"},{"line_number":52,"context_line":"        (float(dt.microsecond) / 1000000)"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_85949e37","line":49,"in_reply_to":"9a8ffd7b_df223e01","updated":"2016-01-12 12:36:38.000000000","message":"Done","commit_id":"173b7560b4e1f820115328cd01a74512e15c6dd0"}]}
