)]}'
{"tools/hacking.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":46,"context_line":"#N8xx git commit messages"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"IMPORT_EXCEPTIONS \u003d [\u0027sqlalchemy\u0027, \u0027migrate\u0027, \u0027nova.db.sqlalchemy.session\u0027]"},{"line_number":49,"context_line":"START_DOCSTRING_TRIPLE \u003d [\u0027r\"\"\"\u0027, \u0027\"\"\"\u0027, \"\u0027\u0027\u0027\"]"},{"line_number":50,"context_line":"END_DOCSTRING_TRIPLE \u003d [\u0027\"\"\"\u0027, \"\u0027\u0027\u0027\"]"},{"line_number":51,"context_line":"VERBOSE_MISSING_IMPORT \u003d os.getenv(\u0027HACKING_VERBOSE_MISSING_IMPORT\u0027, \u0027False\u0027)"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhEo%3D","line":49,"updated":"2013-01-17 17:55:11.000000000","message":"Technically, \"r\u0027\u0027\u0027\" also qualifies, as would variants beginning with \u0027u\u0027.","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":353,"context_line":"    Okay: \u0027\u0027\u0027foobar\\nfoo\\nbar\\n\u0027\u0027\u0027"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    # This test is not triggered, don\u0027t think it\u0027s right, removing"},{"line_number":356,"context_line":"    # the colon prevents it from running"},{"line_number":357,"context_line":"    N403: def foo():\\n\u0027\u0027\u0027foobar\\nfoo\\nbar\\n   d\u0027\u0027\u0027\\n\\n"},{"line_number":358,"context_line":"    \"\"\""},{"line_number":359,"context_line":"    if (in_docstring_position(previous_logical)):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhEI%3D","line":356,"updated":"2013-01-17 17:55:11.000000000","message":"Does this statement still apply?","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":356,"context_line":"    # the colon prevents it from running"},{"line_number":357,"context_line":"    N403: def foo():\\n\u0027\u0027\u0027foobar\\nfoo\\nbar\\n   d\u0027\u0027\u0027\\n\\n"},{"line_number":358,"context_line":"    \"\"\""},{"line_number":359,"context_line":"    if (in_docstring_position(previous_logical)):"},{"line_number":360,"context_line":"        pos \u003d max([physical_line.find(i) for i in END_DOCSTRING_TRIPLE])"},{"line_number":361,"context_line":"        if (pos !\u003d -1 and len(physical_line) \u003d\u003d pos + 4):"},{"line_number":362,"context_line":"            if (physical_line.strip() not in START_DOCSTRING_TRIPLE):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhEE%3D","line":359,"updated":"2013-01-17 17:55:11.000000000","message":"No need for the enclosing parentheses","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":357,"context_line":"    N403: def foo():\\n\u0027\u0027\u0027foobar\\nfoo\\nbar\\n   d\u0027\u0027\u0027\\n\\n"},{"line_number":358,"context_line":"    \"\"\""},{"line_number":359,"context_line":"    if (in_docstring_position(previous_logical)):"},{"line_number":360,"context_line":"        pos \u003d max([physical_line.find(i) for i in END_DOCSTRING_TRIPLE])"},{"line_number":361,"context_line":"        if (pos !\u003d -1 and len(physical_line) \u003d\u003d pos + 4):"},{"line_number":362,"context_line":"            if (physical_line.strip() not in START_DOCSTRING_TRIPLE):"},{"line_number":363,"context_line":"                return (pos, \"N403: multi line docstring end on new line\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhD4%3D","line":360,"updated":"2013-01-17 17:55:11.000000000","message":"Did you know you could do this without the square brackets?  You turn the expression from a list comprehension into a generator comprehension:\n\n    pos \u003d max(physical_line.find(i) for i in END_DOCSTRING_TRIPLE)\n\nTo demonstrate:\n\n    \u003e\u003e\u003e END_DOCSTRING_TRIPLE \u003d [\u0027\"\"\"\u0027, \"\u0027\u0027\u0027\"]\n    \u003e\u003e\u003e physical_line \u003d \u0027This is \"\"\"a test\"\"\"\u0027\n    \u003e\u003e\u003e max(physical_line.find(i) for i in END_DOCSTRING_TRIPLE)\n    8\n\n(Just a point of information…)","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    \"\"\""},{"line_number":359,"context_line":"    if (in_docstring_position(previous_logical)):"},{"line_number":360,"context_line":"        pos \u003d max([physical_line.find(i) for i in END_DOCSTRING_TRIPLE])"},{"line_number":361,"context_line":"        if (pos !\u003d -1 and len(physical_line) \u003d\u003d pos + 4):"},{"line_number":362,"context_line":"            if (physical_line.strip() not in START_DOCSTRING_TRIPLE):"},{"line_number":363,"context_line":"                return (pos, \"N403: multi line docstring end on new line\")"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhDo%3D","line":361,"updated":"2013-01-17 17:55:11.000000000","message":"The enclosing parentheses on this line and the next are unnecessary.","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":374,"context_line":"    # the colon prevents it from running"},{"line_number":375,"context_line":"    N404: def foo():\\n\u0027\u0027\u0027\\nfoo\\nbar\\n\u0027\u0027\u0027 \\n\\n"},{"line_number":376,"context_line":"    \"\"\""},{"line_number":377,"context_line":"    if (in_docstring_position(previous_logical)):"},{"line_number":378,"context_line":"        pos \u003d max([physical_line.find(i) for i in START_DOCSTRING_TRIPLE])"},{"line_number":379,"context_line":"        # start of docstring when len(tokens)\u003d\u003d0"},{"line_number":380,"context_line":"        if (len(tokens) \u003d\u003d 0 and pos !\u003d -1 and len(physical_line) \u003d\u003d pos + 4):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhDk%3D","line":377,"updated":"2013-01-17 17:55:11.000000000","message":"and, once again, no need for the enclosing parentheses…","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        if (len(tokens) \u003d\u003d 0 and pos !\u003d -1 and len(physical_line) \u003d\u003d pos + 4):"},{"line_number":381,"context_line":"            if (physical_line.strip() in START_DOCSTRING_TRIPLE):"},{"line_number":382,"context_line":"                return (pos, \"N404: multi line docstring \""},{"line_number":383,"context_line":"                        \"should start with a summary\")"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"FORMAT_RE \u003d re.compile(\"%(?:\""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FhDg%3D","line":383,"updated":"2013-01-17 17:55:11.000000000","message":"I shudder to think of the size of this patch…","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"}],"tox.ini":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"886ba412606996ffedf424c14431b126be0c5664","unresolved":false,"context_lines":[{"line_number":20,"context_line":"  python tools/hacking.py --doctest"},{"line_number":21,"context_line":"  python tools/hacking.py --ignore\u003dE12,E711,E721,E712,N403,N404 --repeat --show-source \\"},{"line_number":22,"context_line":"    --exclude\u003d.venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg ."},{"line_number":23,"context_line":"  python tools/hacking.py --ignore\u003dE12,E711,E721,E712,N403,N404 --repeat --show-source \\"},{"line_number":24,"context_line":"    --filename\u003dnova* bin"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"[testenv:pylint]"}],"source_content_type":"text/x-properties","patch_set":1,"id":"AAAAM3%2F%2FhDU%3D","line":23,"updated":"2013-01-17 17:55:11.000000000","message":"This is now 89 columns long; I\u0027d suggest moving the --show-source to the next line for wrapping purposes (and perhaps the --repeat, if that\u0027s insufficient)","commit_id":"5059c9c0c562a521fe4d340905b91d22a61cd2f9"}]}
