)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"186c8bb0d58864ce51387598291127dceeda4966","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d3423bcd_79b915e0","updated":"2025-01-08 11:56:21.000000000","message":"recheck timeout on cover job","commit_id":"a18c59aec1ad94d1ca0e8630391957b83de65574"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a0907e465cbf5590c70dea201ad22d03c31934e0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9a1a1436_e07d349f","updated":"2025-01-28 17:51:35.000000000","message":"some style nits but nothing warrenting a respin","commit_id":"fa03aed087fd7ece5f5d0af70b7c1f11dd499fc3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"36ba44a3f018614e3d3fcec1c85297b65a8d4e0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8f41cf7e_9a22ea18","updated":"2025-06-05 00:07:26.000000000","message":"lgtm. different versioned method were too complex and error prone.","commit_id":"08dd30d3fce13972858019255d55486872f2a1f4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"57bc38b1b99b05084c33232912b8e6caf49e3808","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"805fe864_7d16f243","updated":"2025-06-06 09:41:03.000000000","message":"recheck","commit_id":"08dd30d3fce13972858019255d55486872f2a1f4"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7acb174b7043d9b51c1872ff41396665a2dfed50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"697001f6_4299037b","updated":"2025-06-05 16:29:44.000000000","message":"recheck failure on base patch","commit_id":"08dd30d3fce13972858019255d55486872f2a1f4"}],"doc/source/contributor/microversions.rst":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"36ba44a3f018614e3d3fcec1c85297b65a8d4e0e","unresolved":false,"context_lines":[{"line_number":262,"context_line":"``OpenStack-API-Version`` of \u003c\u003d ``2.4``. If ``2.5`` or later"},{"line_number":263,"context_line":"is specified the server will respond with ``HTTP/404``."},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"Changing a method\u0027s behavior"},{"line_number":266,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"In the controller class::"},{"line_number":269,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"dace747c_19bd2182","side":"PARENT","line":266,"range":{"start_line":265,"start_character":0,"end_line":266,"end_character":29},"updated":"2025-06-05 00:07:26.000000000","message":"++ to update doc also.","commit_id":"a722640b2fea2beba9de4455ee27d38171d56fed"}],"nova/api/openstack/compute/tenant_networks.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a0907e465cbf5590c70dea201ad22d03c31934e0","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                                          project_id\u003dproject_id)"},{"line_number":75,"context_line":"        return self.network_api.get_all(ctx)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @wsgi.api_version(\"2.1\", MAX_PROXY_API_SUPPORT_VERSION)"},{"line_number":78,"context_line":"    @wsgi.expected_errors(())"},{"line_number":79,"context_line":"    @validation.query_schema(schema.index_query)"},{"line_number":80,"context_line":"    def index(self, req):"}],"source_content_type":"text/x-python","patch_set":6,"id":"adb3b237_039e4186","line":77,"range":{"start_line":77,"start_character":29,"end_line":77,"end_character":58},"updated":"2025-01-28 17:51:35.000000000","message":"as an aside you started replacing the constants with explict version in one of these patches.\ni guess we still have some cases where it not inlined but thats out of scope of this patch.","commit_id":"fa03aed087fd7ece5f5d0af70b7c1f11dd499fc3"}],"nova/api/openstack/wsgi.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a0907e465cbf5590c70dea201ad22d03c31934e0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from oslo_utils import strutils"},{"line_number":25,"context_line":"import webob"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"from nova.api.openstack import api_version_request as api_version"},{"line_number":28,"context_line":"from nova.api.openstack import versioned_method"},{"line_number":29,"context_line":"from nova.api import wsgi"},{"line_number":30,"context_line":"from nova import exception"}],"source_content_type":"text/x-python","patch_set":6,"id":"e7f9af89_d1c607ef","side":"PARENT","line":27,"updated":"2025-01-28 17:51:35.000000000","message":"ah right this has to be renamed to not conflict with the function defintion","commit_id":"2628684fb88cdaeac023775b998090b97015a2fb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"36ba44a3f018614e3d3fcec1c85297b65a8d4e0e","unresolved":false,"context_lines":[{"line_number":836,"context_line":"            self._view_builder \u003d self._view_builder_class()"},{"line_number":837,"context_line":"        else:"},{"line_number":838,"context_line":"            self._view_builder \u003d None"},{"line_number":839,"context_line":""},{"line_number":840,"context_line":"    def __getattribute__(self, key):"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        def version_select(*args, **kwargs):"},{"line_number":843,"context_line":"            \"\"\"Look for the method which matches the name supplied and version"},{"line_number":844,"context_line":"            constraints and calls it with the supplied arguments."}],"source_content_type":"text/x-python","patch_set":10,"id":"71c20dbe_1e583e52","side":"PARENT","line":841,"range":{"start_line":839,"start_character":0,"end_line":841,"end_character":0},"updated":"2025-06-05 00:07:26.000000000","message":"Initially I thought of keeping this for sometime because that was a general practice for our microversion and maybe we can return error if any controller differently vesioned the method.\n\nBut as you already changed existing method and pep8 should catch it unless it is marked as #noqa, it is fine to remove. + on doc to remove this way of microversion implementation","commit_id":"a722640b2fea2beba9de4455ee27d38171d56fed"}],"nova/tests/unit/api/openstack/test_wsgi.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"a0907e465cbf5590c70dea201ad22d03c31934e0","unresolved":true,"context_lines":[{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        controller \u003d FakeController()"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.10\u0027)"},{"line_number":867,"context_line":"        self.assertEqual({\u0027resources\u0027: []}, controller.fake_func(req))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.19\u0027)"},{"line_number":870,"context_line":"        self.assertEqual({\u0027resources\u0027: []}, controller.fake_func(req))"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.9\u0027)"},{"line_number":873,"context_line":"        self.assertRaises("},{"line_number":874,"context_line":"            exception.VersionNotFoundForAPIMethod, controller.fake_func, req"},{"line_number":875,"context_line":"        )"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.20\u0027)"},{"line_number":878,"context_line":"        self.assertRaises("},{"line_number":879,"context_line":"            exception.VersionNotFoundForAPIMethod, controller.fake_func, req"},{"line_number":880,"context_line":"        )"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def test_api_version_legacy(self):"},{"line_number":883,"context_line":"        class FakeController(wsgi.Controller):"},{"line_number":884,"context_line":"            @wsgi.api_version(\u00272.0\u0027, \u00272.10\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"98f9773d_5aed0483","line":881,"range":{"start_line":866,"start_character":7,"end_line":881,"end_character":1},"updated":"2025-01-28 17:51:35.000000000","message":"these should really be separate test functions the fake controller created in a setup function.  that or using ddt\n\nits fine in this case as it pretty short but we shoudl generally avoid multiple independent asserts like this in on test.","commit_id":"fa03aed087fd7ece5f5d0af70b7c1f11dd499fc3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"84578509c07ffa3b5ab2ecc2269b39b85f6f67e1","unresolved":false,"context_lines":[{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        controller \u003d FakeController()"},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.10\u0027)"},{"line_number":867,"context_line":"        self.assertEqual({\u0027resources\u0027: []}, controller.fake_func(req))"},{"line_number":868,"context_line":""},{"line_number":869,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.19\u0027)"},{"line_number":870,"context_line":"        self.assertEqual({\u0027resources\u0027: []}, controller.fake_func(req))"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.9\u0027)"},{"line_number":873,"context_line":"        self.assertRaises("},{"line_number":874,"context_line":"            exception.VersionNotFoundForAPIMethod, controller.fake_func, req"},{"line_number":875,"context_line":"        )"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027\u0027, version\u003d\u00272.20\u0027)"},{"line_number":878,"context_line":"        self.assertRaises("},{"line_number":879,"context_line":"            exception.VersionNotFoundForAPIMethod, controller.fake_func, req"},{"line_number":880,"context_line":"        )"},{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    def test_api_version_legacy(self):"},{"line_number":883,"context_line":"        class FakeController(wsgi.Controller):"},{"line_number":884,"context_line":"            @wsgi.api_version(\u00272.0\u0027, \u00272.10\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"cdb2ac87_18c39a83","line":881,"range":{"start_line":866,"start_character":7,"end_line":881,"end_character":1},"in_reply_to":"98f9773d_5aed0483","updated":"2025-01-28 18:13:21.000000000","message":"Aye, I\u0027ve gotten used to writing table-driven tests. I have tried using [subtest](https://blog.ganssle.io/articles/2020/04/subtests-in-python.html) elsewhere, which would let us do this and continue running after a failure, but `stestr` doesn\u0027t currently support it 😞","commit_id":"fa03aed087fd7ece5f5d0af70b7c1f11dd499fc3"}]}
