)]}'
{"HACKING.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":120,"context_line":"Since when testing locally, running the entire test suite on a regular"},{"line_number":121,"context_line":"basis is prohibitively expensive, the ``tools/run-tests-for-diff.sh``"},{"line_number":122,"context_line":"script is provided as a convenient way to run selected tests using"},{"line_number":123,"context_line":"output from \"git diff\".  This allows running only the test files"},{"line_number":124,"context_line":"changed/added in the working tree::"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    tools/run-tests-for-diff.sh"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7faddb67_2324abc5","line":123,"updated":"2019-08-19 14:04:51.000000000","message":"Could mention this takes any commit range-y thing that `git diff` accepts. For example...","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"Since when testing locally, running the entire test suite on a regular"},{"line_number":121,"context_line":"basis is prohibitively expensive, the ``tools/run-tests-for-diff.sh``"},{"line_number":122,"context_line":"script is provided as a convenient way to run selected tests using"},{"line_number":123,"context_line":"output from \"git diff\".  This allows running only the test files"},{"line_number":124,"context_line":"changed/added in the working tree::"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    tools/run-tests-for-diff.sh"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7faddb67_61d7f8ef","line":123,"in_reply_to":"7faddb67_2324abc5","updated":"2019-08-19 16:53:17.000000000","message":"Done","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"}],"tools/run-tests.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright (c) 2019 SUSE"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_03140fe8","line":1,"updated":"2019-08-19 14:04:51.000000000","message":"I\u0027m curious why you\u0027re doing this in python rather than bash","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright (c) 2019 SUSE"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_214ee06e","line":1,"in_reply_to":"7faddb67_03140fe8","updated":"2019-08-19 16:53:17.000000000","message":"- nova is predominantly Python\n- Small bash hacks almost always end up growing into overgrown monstrosities, even when you least expect it\n- Python is nice and shell is horrible","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0ddd265598ba0ef3d0f1f07fec814d47e4b07a38","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright (c) 2019 SUSE"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_61a8581f","line":1,"in_reply_to":"7faddb67_214ee06e","updated":"2019-08-19 16:59:31.000000000","message":"I\u0027m going to (loudly) not respond to this.","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    return os.getenv(\u0027VIRTUAL_ENV\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def tox_env_is_functional():"},{"line_number":45,"context_line":"    return get_tox_env().find(\u0027.tox/functional\u0027) !\u003d -1"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def get_stestr_opts():"},{"line_number":49,"context_line":"    opts \u003d sys.argv[1:]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    if tox_env_is_functional():"},{"line_number":52,"context_line":"        opts \u003d [\u0027--test-path\u003d./nova/tests/functional\u0027] + opts"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    return opts"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def get_test_files():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_63e5c3a3","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":15},"updated":"2019-08-19 14:04:51.000000000","message":"would be nice to get these things from tox.ini\n\n # crudini --get tox.ini testenv:functional commands\n\n stestr --test-path\u003d./nova/tests/functional run {posargs}\n stestr slowest\n\nmeh, probably more trouble than it\u0027s worth","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    return os.getenv(\u0027VIRTUAL_ENV\u0027)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"def tox_env_is_functional():"},{"line_number":45,"context_line":"    return get_tox_env().find(\u0027.tox/functional\u0027) !\u003d -1"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def get_stestr_opts():"},{"line_number":49,"context_line":"    opts \u003d sys.argv[1:]"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    if tox_env_is_functional():"},{"line_number":52,"context_line":"        opts \u003d [\u0027--test-path\u003d./nova/tests/functional\u0027] + opts"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    return opts"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"def get_test_files():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_6147f84d","line":54,"range":{"start_line":44,"start_character":0,"end_line":54,"end_character":15},"in_reply_to":"7faddb67_63e5c3a3","updated":"2019-08-19 16:53:17.000000000","message":"Yeah, I did think about that and decided to leave it for another day.","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                # which use Guard: https://guardgem.org"},{"line_number":69,"context_line":"                continue"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            functional_re \u003d r\u0027^nova/tests/functional/\u0027"},{"line_number":72,"context_line":"            if functional:"},{"line_number":73,"context_line":"                if not re.match(functional_re, f):"},{"line_number":74,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_63d86351","line":71,"range":{"start_line":71,"start_character":12,"end_line":71,"end_character":54},"updated":"2019-08-19 14:04:51.000000000","message":"For efficiency, could do this outside of the loop (even globally), and also compile it.\n\nThough the interpreter is probably doing that for you under the covers anyway.","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                # which use Guard: https://guardgem.org"},{"line_number":69,"context_line":"                continue"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"            functional_re \u003d r\u0027^nova/tests/functional/\u0027"},{"line_number":72,"context_line":"            if functional:"},{"line_number":73,"context_line":"                if not re.match(functional_re, f):"},{"line_number":74,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_017084a3","line":71,"range":{"start_line":71,"start_character":12,"end_line":71,"end_character":54},"in_reply_to":"7faddb67_63d86351","updated":"2019-08-19 16:53:17.000000000","message":"Right ;-)  I think the legibility brought by keeping this closer to its users is more useful in this case.","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                if re.match(functional_re, f):"},{"line_number":77,"context_line":"                    continue"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            test \u003d re.sub(r\u0027\\.py$\u0027, \u0027\u0027, f)"},{"line_number":80,"context_line":"            test \u003d test.replace(\u0027/\u0027, \u0027.\u0027)"},{"line_number":81,"context_line":"            test_files.append(test)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    return test_files"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_03c2cf53","line":81,"range":{"start_line":79,"start_character":12,"end_line":81,"end_character":35},"updated":"2019-08-19 14:04:51.000000000","message":"or\n\n # Convert nova/tests/unit/foo.py to nova.tests.unit.foo\n test_files.append(f[:-3].replace(\u0027/\u0027, \u0027.\u0027))","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                if re.match(functional_re, f):"},{"line_number":77,"context_line":"                    continue"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"            test \u003d re.sub(r\u0027\\.py$\u0027, \u0027\u0027, f)"},{"line_number":80,"context_line":"            test \u003d test.replace(\u0027/\u0027, \u0027.\u0027)"},{"line_number":81,"context_line":"            test_files.append(test)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    return test_files"},{"line_number":84,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_218b401f","line":81,"range":{"start_line":79,"start_character":12,"end_line":81,"end_character":35},"in_reply_to":"7faddb67_03c2cf53","updated":"2019-08-19 16:53:17.000000000","message":"Done","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"f8b7b3d2b36998c285c006fd1dc9ab3ad7029a25","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        sys.exit(0)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    if len(test_files) \u003d\u003d 1:"},{"line_number":95,"context_line":"        stestr_opts \u003d [\u0027-n\u0027] + stestr_opts"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    cmd \u003d [\u0027stestr\u0027, \u0027run\u0027, *stestr_opts] + test_files"},{"line_number":98,"context_line":"    print(\u0027 \u0027.join(cmd))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_4300c734","line":95,"range":{"start_line":95,"start_character":22,"end_line":95,"end_character":28},"updated":"2019-08-19 14:04:51.000000000","message":"a comment here would be nice\n\n # If just one module to run, skip discovery","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"},{"author":{"_account_id":2394,"name":"Adam Spiers","email":"aspiers@suse.com","username":"adam.spiers"},"change_message_id":"ac21b24e0129cd51fd06a33190b8e4ea7c367d0b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        sys.exit(0)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    if len(test_files) \u003d\u003d 1:"},{"line_number":95,"context_line":"        stestr_opts \u003d [\u0027-n\u0027] + stestr_opts"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    cmd \u003d [\u0027stestr\u0027, \u0027run\u0027, *stestr_opts] + test_files"},{"line_number":98,"context_line":"    print(\u0027 \u0027.join(cmd))"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_6174d836","line":95,"range":{"start_line":95,"start_character":22,"end_line":95,"end_character":28},"in_reply_to":"7faddb67_4300c734","updated":"2019-08-19 16:53:17.000000000","message":"Done","commit_id":"27d450fd95f38116d57cd9656faa0c74309a8e4a"}]}
