)]}'
{"openstack_health/api.py":[{"author":{"_account_id":18359,"name":"Moises Trovó","email":"mtrovo@thoughtworks.com","username":"mtrovo"},"change_message_id":"d06434aa11e6873a4f53d69f74fd5c60beeaac99","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    return runs"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"@app.route(\u0027/runs/key/\u003cstring:key\u003e/value/\u003cstring:value\u003e\u0027, methods\u003d[\u0027GET\u0027])"},{"line_number":108,"context_line":"def get_runs_for_key_value(key, value):"},{"line_number":109,"context_line":"    global Session"},{"line_number":110,"context_line":"    session \u003d Session()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_8aa19b96","line":107,"updated":"2015-09-23 16:38:49.000000000","message":"This is too abstract to be on REST public API, it should be something more concrete like /job/\u003cstring:job_name\u003e as for the second page view or if it\u0027s really necessary to be abstract, it should be changed to something like\n/runs/filter_by_metadata?key\u003d\u003ckey\u003e\u0026value\u003d\u003cvalue\u003e or /runs/filter_by_metadata?\u003ckey\u003e\u003d\u003cvalue\u003e which is much more clean","commit_id":"deda52ad2445ba055e21317b0711ccb7a541e81d"},{"author":{"_account_id":17001,"name":"Tim Buckley","email":"timothy.jas.buckley@hpe.com","username":"timothy.jas.buckley"},"change_message_id":"32a48f94c2696e95ccb34db9b96f51212dec57f6","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    return runs"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"@app.route(\u0027/runs/key/\u003cstring:key\u003e/value/\u003cstring:value\u003e\u0027, methods\u003d[\u0027GET\u0027])"},{"line_number":108,"context_line":"def get_runs_for_key_value(key, value):"},{"line_number":109,"context_line":"    global Session"},{"line_number":110,"context_line":"    session \u003d Session()"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba15a1d1_5f26d8ce","line":107,"in_reply_to":"ba15a1d1_8aa19b96","updated":"2015-09-23 21:10:00.000000000","message":"This URL scheme actually doesn\u0027t work for projects because they have \u0027/\u0027 characters in their names. Flask treats that as a new path segment, so any valid project name (e.g. openstack/openstack-health) will always return a 404 in the API. Passing values in as a parameter instead would be a quick fix.","commit_id":"deda52ad2445ba055e21317b0711ccb7a541e81d"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8168cffb9001d64dec3769e1414bbf35cab3625e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    return jsonify({\u0027runs\u0027: out_runs})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def _filter_run_dicts_by_res(date_res, sec_runs):"},{"line_number":103,"context_line":"    runs \u003d {}"},{"line_number":104,"context_line":"    for run in sec_runs:"},{"line_number":105,"context_line":"        # Filter resolution"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_6e8284ca","line":102,"updated":"2015-10-02 14:30:17.000000000","message":"This function is duplicated, we only need it defined once, it looks like a rebase mistake.","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"c49888dc565fe6afcd2f3f918f7767edfcec936e","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    return jsonify({\u0027runs\u0027: out_runs})"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"def _filter_run_dicts_by_res(date_res, sec_runs):"},{"line_number":103,"context_line":"    runs \u003d {}"},{"line_number":104,"context_line":"    for run in sec_runs:"},{"line_number":105,"context_line":"        # Filter resolution"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a2fa921_7174cffc","line":102,"in_reply_to":"9a1a9d01_6e8284ca","updated":"2015-10-05 18:43:33.000000000","message":"Where is it defined?","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8168cffb9001d64dec3769e1414bbf35cab3625e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return runs"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def _group_val_lists_by(kvals, keyfunc):"},{"line_number":121,"context_line":"    return {key: {k: list(v) for k, v in itertools.groupby(val, keyfunc)}"},{"line_number":122,"context_line":"            for key, val in kvals.iteritems()}"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_f1a99525","line":120,"updated":"2015-10-02 14:30:17.000000000","message":"I think we should have a comment on what this function is doing. It\u0027s a bit dense and I think we need to explain it\u0027s intent.","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"c49888dc565fe6afcd2f3f918f7767edfcec936e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return runs"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def _group_val_lists_by(kvals, keyfunc):"},{"line_number":121,"context_line":"    return {key: {k: list(v) for k, v in itertools.groupby(val, keyfunc)}"},{"line_number":122,"context_line":"            for key, val in kvals.iteritems()}"},{"line_number":123,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a2fa921_71efefb0","line":120,"in_reply_to":"9a1a9d01_f1a99525","updated":"2015-10-05 18:43:33.000000000","message":"Done","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8168cffb9001d64dec3769e1414bbf35cab3625e","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        grouped_runs \u003d _group_val_lists_by(sec_runs, keyfunc)"},{"line_number":138,"context_line":"        runs \u003d _filter_by_date_res(date_range, grouped_runs)"},{"line_number":139,"context_line":"    else:"},{"line_number":140,"context_line":"        runs \u003d sec_runs"},{"line_number":141,"context_line":"    out_runs \u003d {}"},{"line_number":142,"context_line":"    for run in runs:"},{"line_number":143,"context_line":"        out_runs[run.isoformat()] \u003d runs[run]"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_2496ed94","line":140,"updated":"2015-10-02 14:30:17.000000000","message":"Ignoring the groupby key here is gonna cause issues if you use second resolution right?","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"c49888dc565fe6afcd2f3f918f7767edfcec936e","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        grouped_runs \u003d _group_val_lists_by(sec_runs, keyfunc)"},{"line_number":138,"context_line":"        runs \u003d _filter_by_date_res(date_range, grouped_runs)"},{"line_number":139,"context_line":"    else:"},{"line_number":140,"context_line":"        runs \u003d sec_runs"},{"line_number":141,"context_line":"    out_runs \u003d {}"},{"line_number":142,"context_line":"    for run in runs:"},{"line_number":143,"context_line":"        out_runs[run.isoformat()] \u003d runs[run]"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a2fa921_711dafbc","line":140,"in_reply_to":"9a1a9d01_2496ed94","updated":"2015-10-05 18:43:33.000000000","message":"Done","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"8168cffb9001d64dec3769e1414bbf35cab3625e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    return jsonify({\u0027runs\u0027: runs})"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"@app.route(\u0027/projects/\u003cpath:project\u003e/runs\u0027, methods\u003d[\u0027GET\u0027])"},{"line_number":161,"context_line":"def get_runs_by_project(project):"},{"line_number":162,"context_line":"    start_date \u003d flask.request.args.get(\u0027start_date\u0027, None)"},{"line_number":163,"context_line":"    stop_date \u003d flask.request.args.get(\u0027stop_date\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_645705cb","line":160,"updated":"2015-10-02 14:30:17.000000000","message":"I thought we didn\u0027t want to use projects int the path because the slash messes things up. Like this would be:\n\n  /projects/openstack/tempest/runs\n\nwhich won\u0027t do the right thing. I mean yeah we can escape it, but I thought we were gonna do something else to get around that.","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"c49888dc565fe6afcd2f3f918f7767edfcec936e","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    return jsonify({\u0027runs\u0027: runs})"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"@app.route(\u0027/projects/\u003cpath:project\u003e/runs\u0027, methods\u003d[\u0027GET\u0027])"},{"line_number":161,"context_line":"def get_runs_by_project(project):"},{"line_number":162,"context_line":"    start_date \u003d flask.request.args.get(\u0027start_date\u0027, None)"},{"line_number":163,"context_line":"    stop_date \u003d flask.request.args.get(\u0027stop_date\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a2fa921_005e67e9","line":160,"in_reply_to":"9a1a9d01_645705cb","updated":"2015-10-05 18:43:33.000000000","message":"This is already handled by Flask in a pretty cool way: http://flask.pocoo.org/snippets/76/","commit_id":"2acdc3ffd828baabf4ce0b3cdd15fee5274ec895"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"5e39de1b64427f32d76640b05b2ebdd83b6a107c","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def _group_runs_by(runs, keyfunc):"},{"line_number":121,"context_line":"    return {timestamp: {key: list(val) for key, val in itertools.groupby(grouped_runs, keyfunc)}"},{"line_number":122,"context_line":"                                       for timestamp, grouped_runs in runs.iteritems()}"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"def _get_runs_for_key_value_grouped_by(key, value, groupby_key,"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a2fa921_6c4b94b1","line":122,"updated":"2015-10-05 19:11:16.000000000","message":"Looks like pep8 really doesn\u0027t like Ls 121 and 122 - what do folks think about unrolling this one liner?","commit_id":"6f905839d5ee19d70e42aa91bddce1b261f93994"},{"author":{"_account_id":11682,"name":"Ryan Moats","email":"rmoats@us.ibm.com","username":"regXboi"},"change_message_id":"5e39de1b64427f32d76640b05b2ebdd83b6a107c","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    global Session"},{"line_number":133,"context_line":"    session \u003d Session()"},{"line_number":134,"context_line":"    runs_by_timestamp \u003d api.get_time_series_runs_by_key_value(key, value, start_date,"},{"line_number":135,"context_line":"                                                              stop_date, session)"},{"line_number":136,"context_line":"    if date_range is \u0027sec\u0027:"},{"line_number":137,"context_line":"        # Nothing to do since it is already grouped by timestamp"},{"line_number":138,"context_line":"        runs \u003d runs_by_timestamp"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a2fa921_8cdb90ed","line":135,"updated":"2015-10-05 19:11:16.000000000","message":"ditto Ls 134 and 135 - can we shortening the function name?","commit_id":"6f905839d5ee19d70e42aa91bddce1b261f93994"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"9f98697420776cc62de021dfcde37261010f6890","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return runs"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def _group_runs_by(runs, keyfunc):"},{"line_number":121,"context_line":"    grouped_runs_by \u003d {}"},{"line_number":122,"context_line":"    for timestamp, runs_by_time in runs.iteritems():"},{"line_number":123,"context_line":"        if timestamp not in grouped_runs_by:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_8ae28d9e","line":120,"updated":"2015-10-05 21:44:56.000000000","message":"I still think we need a comment/docstring to explain what this function is doing. It\u0027ll help when people come back to this in the future.","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"27fba6e2b6b3fe278377adfed817b93dc7998b79","unresolved":false,"context_lines":[{"line_number":117,"context_line":"    return runs"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"def _group_runs_by(runs, keyfunc):"},{"line_number":121,"context_line":"    grouped_runs_by \u003d {}"},{"line_number":122,"context_line":"    for timestamp, runs_by_time in runs.iteritems():"},{"line_number":123,"context_line":"        if timestamp not in grouped_runs_by:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_f1d8b855","line":120,"in_reply_to":"7a2fa921_8ae28d9e","updated":"2015-10-06 14:46:50.000000000","message":"Done","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"9f98697420776cc62de021dfcde37261010f6890","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    grouped_runs \u003d _group_runs_by(runs_by_timestamp, keyfunc)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    if date_range !\u003d \u0027sec\u0027:"},{"line_number":149,"context_line":"        # Nothing to do since it is already grouped by timestamp"},{"line_number":150,"context_line":"        grouped_runs \u003d _filter_by_date_res(date_range, grouped_runs)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    out_runs \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_4a7eb5e5","line":149,"updated":"2015-10-05 21:44:56.000000000","message":"This comment does not apply to this block. (it\u0027s also inaccurate in general since it\u0027s a time series dict that\u0027s returned by subunit2sql)","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"27fba6e2b6b3fe278377adfed817b93dc7998b79","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    grouped_runs \u003d _group_runs_by(runs_by_timestamp, keyfunc)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    if date_range !\u003d \u0027sec\u0027:"},{"line_number":149,"context_line":"        # Nothing to do since it is already grouped by timestamp"},{"line_number":150,"context_line":"        grouped_runs \u003d _filter_by_date_res(date_range, grouped_runs)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    out_runs \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_ee4f7590","line":149,"in_reply_to":"7a2fa921_4a7eb5e5","updated":"2015-10-06 14:46:50.000000000","message":"Done","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"9f98697420776cc62de021dfcde37261010f6890","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        job_data \u003d []"},{"line_number":195,"context_line":"        for build in builds:"},{"line_number":196,"context_line":"            runs \u003d builds[build]"},{"line_number":197,"context_line":"            successes \u003d sum(map(lambda x: 1 if x[\u0027fail\u0027] \u003d\u003d 0 else 0, runs))"},{"line_number":198,"context_line":"            failures \u003d len(runs) - successes"},{"line_number":199,"context_line":"            avg_runtime \u003d sum(map(itemgetter(\u0027run_time\u0027), runs)) / len(runs)"},{"line_number":200,"context_line":"            job_data.append({\u0027fail\u0027: failures,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_4a9a3516","line":197,"updated":"2015-10-05 21:44:56.000000000","message":"I think this line needs a comment to explain the intent of this call will be useful too. It took me a little bit to wrap my head around the intent (aside from assuming based on the variable names)","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"27fba6e2b6b3fe278377adfed817b93dc7998b79","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        job_data \u003d []"},{"line_number":195,"context_line":"        for build in builds:"},{"line_number":196,"context_line":"            runs \u003d builds[build]"},{"line_number":197,"context_line":"            successes \u003d sum(map(lambda x: 1 if x[\u0027fail\u0027] \u003d\u003d 0 else 0, runs))"},{"line_number":198,"context_line":"            failures \u003d len(runs) - successes"},{"line_number":199,"context_line":"            avg_runtime \u003d sum(map(itemgetter(\u0027run_time\u0027), runs)) / len(runs)"},{"line_number":200,"context_line":"            job_data.append({\u0027fail\u0027: failures,"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_8eb4c1f2","line":197,"in_reply_to":"7a2fa921_4a9a3516","updated":"2015-10-06 14:46:50.000000000","message":"Done","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0e7cd9d7d4429638d2b4a4a04f857d24227c3cad","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return jsonify({\u0027runs\u0027: runs})"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _group_by_date_range(date_range, sec_runs):"},{"line_number":46,"context_line":"    runs \u003d {}"},{"line_number":47,"context_line":"    for run in sec_runs:"},{"line_number":48,"context_line":"        # Filter resolution"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_37faa0be","line":45,"updated":"2015-10-06 14:57:01.000000000","message":"While this is probably a better name we should this to a separate commit that cleans up the function here and the call to it. We only want one functional change per commit so unrelated fixes need to be separated out.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages#Structural_split_of_changes","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"624745c09be947fb0f5e1516a3a2082f0fbdd8d0","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    return jsonify({\u0027runs\u0027: runs})"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _group_by_date_range(date_range, sec_runs):"},{"line_number":46,"context_line":"    runs \u003d {}"},{"line_number":47,"context_line":"    for run in sec_runs:"},{"line_number":48,"context_line":"        # Filter resolution"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_28deba6d","line":45,"in_reply_to":"7a2fa921_37faa0be","updated":"2015-10-06 16:40:22.000000000","message":"Done","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0e7cd9d7d4429638d2b4a4a04f857d24227c3cad","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"def _calc_amount_of_successful_runs(runs):"},{"line_number":163,"context_line":"    \u0027\u0027\u0027"},{"line_number":164,"context_line":"    Calculates the amount of successful runs."},{"line_number":165,"context_line":"    If there were any failures, then the whole run failed."},{"line_number":166,"context_line":"    If there were no failures, then the whole run succeeded."}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_37e860e2","line":163,"updated":"2015-10-06 14:57:01.000000000","message":"PEP 257 says you should only use double quotes for docstrings, like: \"\"\"\nnot single quotes. So we should probably fix this.\n\nhttps://www.python.org/dev/peps/pep-0257/","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"624745c09be947fb0f5e1516a3a2082f0fbdd8d0","unresolved":false,"context_lines":[{"line_number":160,"context_line":""},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"def _calc_amount_of_successful_runs(runs):"},{"line_number":163,"context_line":"    \u0027\u0027\u0027"},{"line_number":164,"context_line":"    Calculates the amount of successful runs."},{"line_number":165,"context_line":"    If there were any failures, then the whole run failed."},{"line_number":166,"context_line":"    If there were no failures, then the whole run succeeded."}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_48dbf67c","line":163,"in_reply_to":"7a2fa921_37e860e2","updated":"2015-10-06 16:40:22.000000000","message":"Done","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"0e7cd9d7d4429638d2b4a4a04f857d24227c3cad","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def _calc_amount_of_failed_runs(runs, amount_of_success_runs):"},{"line_number":174,"context_line":"    \u0027\u0027\u0027"},{"line_number":175,"context_line":"    Calculates the amount of failed runs."},{"line_number":176,"context_line":"    It simply subtracts the amount of runs by the amount of successful ones."},{"line_number":177,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_57e5dc06","line":174,"updated":"2015-10-06 14:57:01.000000000","message":"here too","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"624745c09be947fb0f5e1516a3a2082f0fbdd8d0","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"def _calc_amount_of_failed_runs(runs, amount_of_success_runs):"},{"line_number":174,"context_line":"    \u0027\u0027\u0027"},{"line_number":175,"context_line":"    Calculates the amount of failed runs."},{"line_number":176,"context_line":"    It simply subtracts the amount of runs by the amount of successful ones."},{"line_number":177,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"7a2fa921_c8d5c643","line":174,"in_reply_to":"7a2fa921_57e5dc06","updated":"2015-10-06 16:40:22.000000000","message":"Done","commit_id":"5b7c0175575cc5117deaa56b6173c7a88385b402"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"62a888368d36a0c82b959f68b94b297246256fd0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            corr_res \u003d run.replace(minute\u003d0, second\u003d0, microsecond\u003d0)"},{"line_number":53,"context_line":"        elif date_res \u003d\u003d \u0027day\u0027:"},{"line_number":54,"context_line":"            corr_res \u003d run.date()"},{"line_number":55,"context_line":"        # Build runs dict with correct resolution"},{"line_number":56,"context_line":"        if corr_res in runs:"},{"line_number":57,"context_line":"            for local_run in sec_runs[run]:"},{"line_number":58,"context_line":"                if runs[corr_res].get(local_run, None):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_68b4b2f1","line":55,"updated":"2015-10-06 16:44:12.000000000","message":"Well I won\u0027t hold this unrelated change against you :)","commit_id":"852fff384f40aa56b7a47f853125701acbe38988"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"1b0490fdfbf1fe7076ab54be722809bc1612e3f0","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            corr_res \u003d run.replace(minute\u003d0, second\u003d0, microsecond\u003d0)"},{"line_number":53,"context_line":"        elif date_res \u003d\u003d \u0027day\u0027:"},{"line_number":54,"context_line":"            corr_res \u003d run.date()"},{"line_number":55,"context_line":"        # Build runs dict with correct resolution"},{"line_number":56,"context_line":"        if corr_res in runs:"},{"line_number":57,"context_line":"            for local_run in sec_runs[run]:"},{"line_number":58,"context_line":"                if runs[corr_res].get(local_run, None):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7a2fa921_c81706a2","line":55,"in_reply_to":"7a2fa921_68b4b2f1","updated":"2015-10-06 16:47:33.000000000","message":"Woops.. :)","commit_id":"852fff384f40aa56b7a47f853125701acbe38988"}],"openstack_health/manage.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1d3e2e42cc6e6fd43b880a3c1ba5916ce924c610","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"@manager.command"},{"line_number":25,"context_line":"def list_routes():"},{"line_number":26,"context_line":"    import urllib"},{"line_number":27,"context_line":"    output \u003d []"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_0ae1d42c","line":25,"updated":"2015-09-30 15:17:43.000000000","message":"What is this file used for and how does it relate to the second view rest api? This seems like something independent and probably should be a separate patch.","commit_id":"940e2a86adb127c94982195f8078995f3bec0480"}],"openstack_health/tests/test_api.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1d3e2e42cc6e6fd43b880a3c1ba5916ce924c610","unresolved":false,"context_lines":[{"line_number":24,"context_line":"timestamp_a \u003d datetime.datetime(1914, 8, 26, 20, 0, 0)"},{"line_number":25,"context_line":"timestamp_b \u003d datetime.datetime(1914, 8, 26, 20, 0, 1)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"timestamp_d1 \u003d datetime.datetime(1914, 8, 26, 20, 0, 1)"},{"line_number":28,"context_line":"timestamp_d2 \u003d datetime.datetime(1914, 8, 27, 20, 0, 1)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_4ac90cab","line":27,"updated":"2015-09-30 15:17:43.000000000","message":"Why are these different from timestamp_a and timestamp_b, they seem like the same thing","commit_id":"940e2a86adb127c94982195f8078995f3bec0480"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"1d3e2e42cc6e6fd43b880a3c1ba5916ce924c610","unresolved":false,"context_lines":[{"line_number":383,"context_line":"                    dict(A\u003d10, C\u003d2)]}}, cur_ret)"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    def test_filter_by_date_res(self):"},{"line_number":386,"context_line":""},{"line_number":387,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a1a9d01_eab82013","line":386,"updated":"2015-09-30 15:17:43.000000000","message":"This test is empty","commit_id":"940e2a86adb127c94982195f8078995f3bec0480"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"aa7b00e1470a507edac37119c4e32c84f85b3ff2","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                                    \u0027run_time\u0027: 20.0,"},{"line_number":318,"context_line":"                                    \u0027metadata\u0027: {\u0027build_name\u0027: \u0027value-3\u0027}}]"},{"line_number":319,"context_line":"                })"},{"line_number":320,"context_line":"    def test_get_runs_by_project_resolution_day(self, api_mock):"},{"line_number":321,"context_line":"        api.Session \u003d mock.MagicMock()"},{"line_number":322,"context_line":"        query \u003d \u0027datetime_resolution\u003dday\u0027"},{"line_number":323,"context_line":"        res \u003d self.app.get(\u0027/projects/openstack/trove/runs?{0}\u0027.format(query))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_a786a5b7","line":320,"updated":"2015-10-05 19:42:03.000000000","message":"Can we have a unit test with other resolutiosn, like seconds? Since we branch the code and run or don\u0027t run different paths based on that its good to have coverage there and see that things work as expected","commit_id":"f2e98c8e015b929f4821706b67418b793d20446e"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"ccbb8c7949b0622bd95e63f9bdb90dc3eee6f8b1","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                                    \u0027run_time\u0027: 20.0,"},{"line_number":318,"context_line":"                                    \u0027metadata\u0027: {\u0027build_name\u0027: \u0027value-3\u0027}}]"},{"line_number":319,"context_line":"                })"},{"line_number":320,"context_line":"    def test_get_runs_by_project_resolution_day(self, api_mock):"},{"line_number":321,"context_line":"        api.Session \u003d mock.MagicMock()"},{"line_number":322,"context_line":"        query \u003d \u0027datetime_resolution\u003dday\u0027"},{"line_number":323,"context_line":"        res \u003d self.app.get(\u0027/projects/openstack/trove/runs?{0}\u0027.format(query))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_aa13c95b","line":320,"in_reply_to":"7a2fa921_a786a5b7","updated":"2015-10-05 21:05:21.000000000","message":"Done","commit_id":"f2e98c8e015b929f4821706b67418b793d20446e"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"9f98697420776cc62de021dfcde37261010f6890","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                                    \u0027run_time\u0027: 20.0,"},{"line_number":373,"context_line":"                                    \u0027metadata\u0027: {\u0027build_name\u0027: \u0027value-3\u0027}}]"},{"line_number":374,"context_line":"                })"},{"line_number":375,"context_line":"    def test_get_runs_by_project_resolution_day(self, api_mock):"},{"line_number":376,"context_line":"        api.Session \u003d mock.MagicMock()"},{"line_number":377,"context_line":"        query \u003d \u0027datetime_resolution\u003dday\u0027"},{"line_number":378,"context_line":"        res \u003d self.app.get(\u0027/projects/openstack/trove/runs?{0}\u0027.format(query))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_4d7ecfe5","line":375,"updated":"2015-10-05 21:44:56.000000000","message":"It would be nice to have unit tests for the other resolutions too. It\u0027s not really a requirement because since it doesn\u0027t really deviate too much between min, hour, and days","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"},{"author":{"_account_id":17995,"name":"Glauco Oliveira","email":"gvinici@thoughtworks.com","username":"glauco"},"change_message_id":"27fba6e2b6b3fe278377adfed817b93dc7998b79","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                                    \u0027run_time\u0027: 20.0,"},{"line_number":373,"context_line":"                                    \u0027metadata\u0027: {\u0027build_name\u0027: \u0027value-3\u0027}}]"},{"line_number":374,"context_line":"                })"},{"line_number":375,"context_line":"    def test_get_runs_by_project_resolution_day(self, api_mock):"},{"line_number":376,"context_line":"        api.Session \u003d mock.MagicMock()"},{"line_number":377,"context_line":"        query \u003d \u0027datetime_resolution\u003dday\u0027"},{"line_number":378,"context_line":"        res \u003d self.app.get(\u0027/projects/openstack/trove/runs?{0}\u0027.format(query))"}],"source_content_type":"text/x-python","patch_set":11,"id":"7a2fa921_fc816f90","line":375,"in_reply_to":"7a2fa921_4d7ecfe5","updated":"2015-10-06 14:46:50.000000000","message":"Done","commit_id":"a40471070dcd10f044743b9144cf4288cdc861a2"}]}
