)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b7bde662babb412eb13115eeb79d84c3442aa164","unresolved":false,"context_lines":[{"line_number":14,"context_line":"It uses python\u0027s json lib to load and pretty-print json files. Then"},{"line_number":15,"context_line":"the original json string is compared to the pretty-printed version."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It also iterates through the files, and does not exist on the first"},{"line_number":18,"context_line":"line difference."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I27f48415d13b7e4ca4c3cd7609e9521648deb44f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a30ddce_a3e095fb","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":16},"updated":"2017-03-09 15:30:38.000000000","message":"It is not clear to me what you mean by this.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"d9753d89b9f7f0bb314b28af4e3257ce552aecb7","unresolved":false,"context_lines":[{"line_number":14,"context_line":"It uses python\u0027s json lib to load and pretty-print json files. Then"},{"line_number":15,"context_line":"the original json string is compared to the pretty-printed version."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It also iterates through the files, and does not exist on the first"},{"line_number":18,"context_line":"line difference."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I27f48415d13b7e4ca4c3cd7609e9521648deb44f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9a30ddce_d2854807","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":16},"in_reply_to":"9a30ddce_a3e095fb","updated":"2017-03-09 18:42:39.000000000","message":"I tried to explain that the checker is fault tolerant.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"120b907ea1a5dacb926ef97a8595e758701db1b2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"It uses python\u0027s json lib to load and pretty-print json files. Then"},{"line_number":15,"context_line":"the original json string is compared to the pretty-printed version."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"It also iterates through the files, and does not exist on the first"},{"line_number":18,"context_line":"line difference."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I27f48415d13b7e4ca4c3cd7609e9521648deb44f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a1ced50_2dd15ace","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":16},"in_reply_to":"9a30ddce_d2854807","updated":"2017-03-17 10:39:25.000000000","message":"I see. I was confused by \u0027exist\u0027 as I read it as \u0027exists\u0027.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"}],"tools/jsonchecker.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b7bde662babb412eb13115eeb79d84c3442aa164","unresolved":false,"context_lines":[{"line_number":8,"context_line":"import sys"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"def check_style(json_str, pretty_json_str):"},{"line_number":12,"context_line":"    if json_str \u003d\u003d pretty_json_str:"},{"line_number":13,"context_line":"        return"},{"line_number":14,"context_line":"    lines \u003d json_str.splitlines()"},{"line_number":15,"context_line":"    pretty_lines \u003d pretty_json_str.splitlines()"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    assert (len(lines) \u003d\u003d len(pretty_lines)), (\"File should contain %d \""},{"line_number":18,"context_line":"                                               \"lines\" % len(pretty_lines))"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    for i in range(len(lines)):"},{"line_number":21,"context_line":"        if lines[i] !\u003d pretty_lines[i]:"},{"line_number":22,"context_line":"            yield (\u0027Line %d should be the following: %s\u0027 %"},{"line_number":23,"context_line":"                   (i+1, repr(pretty_lines[i])))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_23682587","line":23,"range":{"start_line":11,"start_character":0,"end_line":23,"end_character":48},"updated":"2017-03-09 15:30:38.000000000","message":"can we simply use difflib [1] to compare the two string and print an unified diff?\n\n[1]https://docs.python.org/2/library/difflib.html","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"d9753d89b9f7f0bb314b28af4e3257ce552aecb7","unresolved":false,"context_lines":[{"line_number":8,"context_line":"import sys"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"def check_style(json_str, pretty_json_str):"},{"line_number":12,"context_line":"    if json_str \u003d\u003d pretty_json_str:"},{"line_number":13,"context_line":"        return"},{"line_number":14,"context_line":"    lines \u003d json_str.splitlines()"},{"line_number":15,"context_line":"    pretty_lines \u003d pretty_json_str.splitlines()"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"    assert (len(lines) \u003d\u003d len(pretty_lines)), (\"File should contain %d \""},{"line_number":18,"context_line":"                                               \"lines\" % len(pretty_lines))"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    for i in range(len(lines)):"},{"line_number":21,"context_line":"        if lines[i] !\u003d pretty_lines[i]:"},{"line_number":22,"context_line":"            yield (\u0027Line %d should be the following: %s\u0027 %"},{"line_number":23,"context_line":"                   (i+1, repr(pretty_lines[i])))"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def main():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_b2db744e","line":23,"range":{"start_line":11,"start_character":0,"end_line":23,"end_character":48},"in_reply_to":"9a30ddce_23682587","updated":"2017-03-09 18:42:39.000000000","message":"Thanks, that might be a good idea.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b7bde662babb412eb13115eeb79d84c3442aa164","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                json_str \u003d file.read()"},{"line_number":40,"context_line":"                try:"},{"line_number":41,"context_line":"                    json_obj \u003d json.loads("},{"line_number":42,"context_line":"                        json_str, object_pairs_hook\u003dcollections.OrderedDict)"},{"line_number":43,"context_line":"                    pretty_json_str \u003d json.dumps(json_obj,"},{"line_number":44,"context_line":"                                                 sort_keys\u003dFalse,"},{"line_number":45,"context_line":"                                                 indent\u003d4)"},{"line_number":46,"context_line":"                    for error in check_style(json_str, pretty_json_str):"},{"line_number":47,"context_line":"                        if return_value \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_036161d3","line":44,"range":{"start_line":42,"start_character":0,"end_line":44,"end_character":65},"updated":"2017-03-09 15:30:38.000000000","message":"Could we drop the OrderedDict hook and use just sort_keys\u003dTrue to keep the json output stable?","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"d9753d89b9f7f0bb314b28af4e3257ce552aecb7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                json_str \u003d file.read()"},{"line_number":40,"context_line":"                try:"},{"line_number":41,"context_line":"                    json_obj \u003d json.loads("},{"line_number":42,"context_line":"                        json_str, object_pairs_hook\u003dcollections.OrderedDict)"},{"line_number":43,"context_line":"                    pretty_json_str \u003d json.dumps(json_obj,"},{"line_number":44,"context_line":"                                                 sort_keys\u003dFalse,"},{"line_number":45,"context_line":"                                                 indent\u003d4)"},{"line_number":46,"context_line":"                    for error in check_style(json_str, pretty_json_str):"},{"line_number":47,"context_line":"                        if return_value \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a30ddce_5216b8f1","line":44,"range":{"start_line":42,"start_character":0,"end_line":44,"end_character":65},"in_reply_to":"9a30ddce_036161d3","updated":"2017-03-09 18:42:39.000000000","message":"I think we cannot do that. By that way, we would lose the original order of the json\u0027s key-value pairs, and that would always be a difference for the existing jsons. However, if we want to be the most precise we can, we can require that the notification samples k-v pairs must be sorted by keys but I think we could leave the order as it was originally. And that requires the OrderedDict.\n\nHow do you think about it?","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"120b907ea1a5dacb926ef97a8595e758701db1b2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                json_str \u003d file.read()"},{"line_number":40,"context_line":"                try:"},{"line_number":41,"context_line":"                    json_obj \u003d json.loads("},{"line_number":42,"context_line":"                        json_str, object_pairs_hook\u003dcollections.OrderedDict)"},{"line_number":43,"context_line":"                    pretty_json_str \u003d json.dumps(json_obj,"},{"line_number":44,"context_line":"                                                 sort_keys\u003dFalse,"},{"line_number":45,"context_line":"                                                 indent\u003d4)"},{"line_number":46,"context_line":"                    for error in check_style(json_str, pretty_json_str):"},{"line_number":47,"context_line":"                        if return_value \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a1ced50_ed62e215","line":44,"range":{"start_line":42,"start_character":0,"end_line":44,"end_character":65},"in_reply_to":"9a30ddce_5216b8f1","updated":"2017-03-17 10:39:25.000000000","message":"Ohh so this makes the order of the keys in the currently stored samples valid so you don\u0027t have to reorder all the existing samples. Nice.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27cbbd96d17e902d2c4f77b0d5d221eaefe6552b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"from __future__ import print_function"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import argparse"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a1ced50_c85fd40c","line":1,"updated":"2017-03-17 10:39:15.000000000","message":"Needs Apache licence header","commit_id":"81f6ccbe756a3dad2ee50cf46a344b095b055638"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"54e1edd62bbad897a03ae1ea7fcd7dcc954c6465","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"from __future__ import print_function"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import argparse"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_d0c85177","line":1,"updated":"2017-03-17 14:59:36.000000000","message":"still needs the apache licence header","commit_id":"c278772971b0952f3141e3caf4877171f1bcc2be"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"54e1edd62bbad897a03ae1ea7fcd7dcc954c6465","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                                                 indent\u003d4)"},{"line_number":32,"context_line":"                    lines \u003d json_str.splitlines()"},{"line_number":33,"context_line":"                    pretty_lines \u003d pretty_json_str.splitlines()"},{"line_number":34,"context_line":"                    pretty_lines \u003d [line.rstrip() for line in pretty_lines]"},{"line_number":35,"context_line":"                    diff \u003d list(difflib.unified_diff("},{"line_number":36,"context_line":"                        lines, pretty_lines, fromfile\u003dpath, tofile\u003dpath))"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_d01a1117","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":75},"updated":"2017-03-17 14:59:36.000000000","message":"let\u0027s add a comment here that we need this as json.dumps adds an extra whitespace after every coma even if that becomes a trailing whitespace.","commit_id":"c278772971b0952f3141e3caf4877171f1bcc2be"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"77cb8478cc28dd8cd66617f4c7637b63d3f866a4","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                                                 indent\u003d4)"},{"line_number":46,"context_line":"                    lines \u003d json_str.splitlines()"},{"line_number":47,"context_line":"                    pretty_lines \u003d pretty_json_str.splitlines()"},{"line_number":48,"context_line":"                    # Required because formatted json has a trailing whitespace"},{"line_number":49,"context_line":"                    # on each line which ends with a comma."},{"line_number":50,"context_line":"                    pretty_lines \u003d [line.rstrip() for line in pretty_lines]"},{"line_number":51,"context_line":"                    diff \u003d list(difflib.unified_diff("},{"line_number":52,"context_line":"                        lines, pretty_lines, fromfile\u003dpath, tofile\u003dpath))"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"bff0334d_fb6456e7","line":50,"range":{"start_line":48,"start_character":1,"end_line":50,"end_character":1},"updated":"2017-04-07 10:15:41.000000000","message":"From https://docs.python.org/2/library/json.html:\n\"Note Since the default item separator is \u0027, \u0027, the output might include trailing whitespace when indent is specified. You can use separators\u003d(\u0027,\u0027, \u0027: \u0027) to avoid this.\"\n\nBased on this I think we can remove the custom code by parameterizing the json.dumps call properly.","commit_id":"8899e766bf601d51a9a164fe6ea6623d2738432f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0f084449b02debbf2207e372c28dbe908d904848","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            if not name.endswith(\u0027.json\u0027):"},{"line_number":36,"context_line":"                continue"},{"line_number":37,"context_line":"            path \u003d os.path.join(root, name)"},{"line_number":38,"context_line":"            with open(path, \u0027r\u0027) as file:"},{"line_number":39,"context_line":"                json_str \u003d file.read()"},{"line_number":40,"context_line":"                try:"},{"line_number":41,"context_line":"                    json_obj \u003d json.loads("}],"source_content_type":"text/x-python","patch_set":9,"id":"7ffa3b31_edf68ad7","line":38,"range":{"start_line":38,"start_character":36,"end_line":38,"end_character":40},"updated":"2017-04-20 16:21:32.000000000","message":"nit: could you call this \u0027stream\u0027 or something to avoid using a Python 2.x keyword?","commit_id":"7ea786f2d31a973c74f464080ff21b072f689136"}],"tox.ini":[{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"d9753d89b9f7f0bb314b28af4e3257ce552aecb7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"basepython \u003d python2.7"},{"line_number":40,"context_line":"commands \u003d"},{"line_number":41,"context_line":"  bash tools/flake8wrap.sh {posargs}"},{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-properties","patch_set":1,"id":"9a30ddce_12ce0082","line":43,"range":{"start_line":42,"start_character":2,"end_line":43,"end_character":118},"updated":"2017-03-09 18:42:39.000000000","message":"And if we check all the directories which contain json files, we can drop this check, as the jsonchecker.py also checks the validity of the jsons.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"120b907ea1a5dacb926ef97a8595e758701db1b2","unresolved":false,"context_lines":[{"line_number":39,"context_line":"basepython \u003d python2.7"},{"line_number":40,"context_line":"commands \u003d"},{"line_number":41,"context_line":"  bash tools/flake8wrap.sh {posargs}"},{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-properties","patch_set":1,"id":"1a1ced50_4d49368b","line":43,"range":{"start_line":42,"start_character":2,"end_line":43,"end_character":118},"in_reply_to":"9a30ddce_12ce0082","updated":"2017-03-17 10:39:25.000000000","message":"good point.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b7bde662babb412eb13115eeb79d84c3442aa164","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"[testenv:functional]"},{"line_number":48,"context_line":"# TODO(melwitt): This can be removed when functional tests are gating with"}],"source_content_type":"text/x-properties","patch_set":1,"id":"9a30ddce_43919946","line":45,"updated":"2017-03-09 15:30:38.000000000","message":"this tool could be useful for the doc/api_samples dir too","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"120b907ea1a5dacb926ef97a8595e758701db1b2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"[testenv:functional]"},{"line_number":48,"context_line":"# TODO(melwitt): This can be removed when functional tests are gating with"}],"source_content_type":"text/x-properties","patch_set":1,"id":"1a1ced50_ed30220a","line":45,"in_reply_to":"9a30ddce_32f064c9","updated":"2017-03-17 10:39:25.000000000","message":"Have you checked if this works well on that directory too? if yes then I would include that dir in this commit too.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"d9753d89b9f7f0bb314b28af4e3257ce552aecb7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"[testenv:functional]"},{"line_number":48,"context_line":"# TODO(melwitt): This can be removed when functional tests are gating with"}],"source_content_type":"text/x-properties","patch_set":1,"id":"9a30ddce_32f064c9","line":45,"in_reply_to":"9a30ddce_43919946","updated":"2017-03-09 18:42:39.000000000","message":"Yes, that\u0027s why I wrote it in this way, so we can check that directory too if we want.","commit_id":"6c45f9b2b474aa9b9cb8739780b262f5eb2c6191"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"27cbbd96d17e902d2c4f77b0d5d221eaefe6552b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  # Check that all included JSON files are valid JSON"},{"line_number":43,"context_line":"  bash -c \u0027! find doc/ -type f -name *.json | xargs -t -n1 python -m json.tool 2\u003e\u00261 \u003e /dev/null | grep -B1 -v ^python\u0027"},{"line_number":44,"context_line":"  # Check that sample notifications formatted well"},{"line_number":45,"context_line":"  python tools/jsonchecker.py --directory doc/notification_samples"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"[testenv:functional]"},{"line_number":48,"context_line":"# TODO(melwitt): This can be removed when functional tests are gating with"}],"source_content_type":"text/x-properties","patch_set":2,"id":"1a1ced50_c848b45e","line":45,"updated":"2017-03-17 10:39:15.000000000","message":"If this tool works well for the api samples then I suggest include that dir as well here.","commit_id":"81f6ccbe756a3dad2ee50cf46a344b095b055638"}]}
