)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"de7c0d7ffc2feb455c7ce95d2e0d91ee5ed6e7cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3fa7e38b_626b1df1","line":24,"updated":"2019-10-02 21:24:43.000000000","message":"turns out this also\n\n Closes-Bug: #1728732","commit_id":"52db9d24fb44b91e82d5f6cd4889fb2fd3104ff4"}],"etc/nova/api-paste.ini":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1ab557affc85cbcb09365e4922ba1accc46d6cae","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# API). It also provides new features via API microversions which are"},{"line_number":26,"context_line":"# opt into for clients. Unaware clients will receive the same frozen"},{"line_number":27,"context_line":"# v2 API feature set, but with some relaxed validation"},{"line_number":28,"context_line":"/v2/+: openstack_compute_api_v21_legacy_v2_compatible"},{"line_number":29,"context_line":"/v2.1/+: openstack_compute_api_v21"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[composite:openstack_compute_api_v21]"},{"line_number":32,"context_line":"use \u003d call:nova.api.auth:pipeline_factory_v21"}],"source_content_type":"text/x-properties","patch_set":7,"id":"3fa7e38b_c9d52e1d","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":34},"updated":"2019-10-05 09:52:52.000000000","message":"We need to keep backward-compatible existing api-paste.ini in the deployment, and yes, we keep it, so we are good at here.","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e5f46ea4c79968f73953e19132b54c03a8b094e2","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# API). It also provides new features via API microversions which are"},{"line_number":26,"context_line":"# opt into for clients. Unaware clients will receive the same frozen"},{"line_number":27,"context_line":"# v2 API feature set, but with some relaxed validation"},{"line_number":28,"context_line":"/v2/+: openstack_compute_api_v21_legacy_v2_compatible"},{"line_number":29,"context_line":"/v2.1/+: openstack_compute_api_v21"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[composite:openstack_compute_api_v21]"},{"line_number":32,"context_line":"use \u003d call:nova.api.auth:pipeline_factory_v21"}],"source_content_type":"text/x-properties","patch_set":7,"id":"3fa7e38b_f86307dc","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":34},"in_reply_to":"3fa7e38b_c9d52e1d","updated":"2019-10-07 14:29:51.000000000","message":"Mm, good point: existing deployments that don\u0027t update their paste.ini will retain their existing behavior - and that\u0027s what we want?","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"852357b1bd7d64e4f9bed372f90f2b48482f7035","unresolved":false,"context_lines":[{"line_number":25,"context_line":"# API). It also provides new features via API microversions which are"},{"line_number":26,"context_line":"# opt into for clients. Unaware clients will receive the same frozen"},{"line_number":27,"context_line":"# v2 API feature set, but with some relaxed validation"},{"line_number":28,"context_line":"/v2/+: openstack_compute_api_v21_legacy_v2_compatible"},{"line_number":29,"context_line":"/v2.1/+: openstack_compute_api_v21"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"[composite:openstack_compute_api_v21]"},{"line_number":32,"context_line":"use \u003d call:nova.api.auth:pipeline_factory_v21"}],"source_content_type":"text/x-properties","patch_set":7,"id":"3fa7e38b_ffcbdfa1","line":29,"range":{"start_line":28,"start_character":0,"end_line":29,"end_character":34},"in_reply_to":"3fa7e38b_f86307dc","updated":"2019-10-08 04:56:00.000000000","message":"Yea, that is John teach me that.","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"}],"nova/api/openstack/auth.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7b1034f2d7af07eda4b32e3a10c42ec91e6ee996","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            # NOTE(efried): The X-Server-Management-Url is calculated based on"},{"line_number":37,"context_line":"            # the fake auth URL used in the request."},{"line_number":38,"context_line":"            os_url \u003d req.url.rstrip(\u0027/\u0027)"},{"line_number":39,"context_line":"            assert os_url.endswith(\u0027/auth\u0027)"},{"line_number":40,"context_line":"            os_url \u003d req.url[:-5]"},{"line_number":41,"context_line":"            if project_id_in_path:"},{"line_number":42,"context_line":"                os_url \u003d \u0027/\u0027.join([os_url.rstrip(\u0027/\u0027), project_id])"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_06122f0a","line":39,"updated":"2019-10-08 13:50:34.000000000","message":"I\u0027ve been told we shouldn\u0027t use assert in production code since it can be optimized away [1]. However, I do see a couple of existing assert calls in the code so we\u0027re obviously not hitting that. I\u0027d still prefer to replace this with an explicit check and raise, but absent that this will do\n\n[1] https://stackoverflow.com/questions/1693088/what-is-the-use-of-pythons-basic-optimizations-mode-python-o","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1334d7ba8ed811444789f06e6e2afe14017e6d41","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            # NOTE(efried): The X-Server-Management-Url is calculated based on"},{"line_number":37,"context_line":"            # the fake auth URL used in the request."},{"line_number":38,"context_line":"            os_url \u003d req.url.rstrip(\u0027/\u0027)"},{"line_number":39,"context_line":"            assert os_url.endswith(\u0027/auth\u0027)"},{"line_number":40,"context_line":"            os_url \u003d req.url[:-5]"},{"line_number":41,"context_line":"            if project_id_in_path:"},{"line_number":42,"context_line":"                os_url \u003d \u0027/\u0027.join([os_url.rstrip(\u0027/\u0027), project_id])"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_e1cb3da2","line":39,"in_reply_to":"3fa7e38b_06122f0a","updated":"2019-10-08 14:21:10.000000000","message":"Confusingly, this is not production code.","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1fe5775d1dafee75a0f295e244479c71fd04f652","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            # NOTE(efried): The X-Server-Management-Url is calculated based on"},{"line_number":37,"context_line":"            # the fake auth URL used in the request."},{"line_number":38,"context_line":"            os_url \u003d req.url.rstrip(\u0027/\u0027)"},{"line_number":39,"context_line":"            assert os_url.endswith(\u0027/auth\u0027)"},{"line_number":40,"context_line":"            os_url \u003d req.url[:-5]"},{"line_number":41,"context_line":"            if project_id_in_path:"},{"line_number":42,"context_line":"                os_url \u003d \u0027/\u0027.join([os_url.rstrip(\u0027/\u0027), project_id])"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_7c5e1213","line":39,"in_reply_to":"3fa7e38b_e1cb3da2","updated":"2019-10-08 15:16:23.000000000","message":"Maybe in some future fup we should consider moving it?\n\nAt which point someone will come along and say they are using it to run nova behind basic auth without keystone (or something).","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1fe5775d1dafee75a0f295e244479c71fd04f652","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            #             keystone uses 2.0 auth.  We should probably allow"},{"line_number":48,"context_line":"            #             2.0 auth here as well."},{"line_number":49,"context_line":"            res.headers[\u0027X-Auth-Token\u0027] \u003d \u0027%s:%s\u0027 % (user_id, project_id)"},{"line_number":50,"context_line":"            res.headers[\u0027X-Server-Management-Url\u0027] \u003d os_url"},{"line_number":51,"context_line":"            res.content_type \u003d \u0027text/plain\u0027"},{"line_number":52,"context_line":"            res.status \u003d \u0027204\u0027"},{"line_number":53,"context_line":"            return res"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_5cfd5638","line":50,"updated":"2019-10-08 15:16:23.000000000","message":"I think you can get rid of this and thus potentially the os_url stuff above and then perhaps the /auth thing entirely","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"}],"nova/api/openstack/compute/routes.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0e14bed3389cefd67b19a425840c806966f0e12b","unresolved":false,"context_lines":[{"line_number":370,"context_line":"ROUTE_LIST \u003d ("},{"line_number":371,"context_line":"    # NOTE: This is a redirection from \u0027\u0027 to \u0027/\u0027. A request to \u0027\u0027 without the"},{"line_number":372,"context_line":"    # ending \u0027/\u0027 will get a response with status code \u0027302\u0027 returned."},{"line_number":373,"context_line":"    (\u0027\u0027, \u0027/\u0027),"},{"line_number":374,"context_line":"    (\u0027/\u0027, {"},{"line_number":375,"context_line":"        \u0027GET\u0027: [version_controller, \u0027show\u0027]"},{"line_number":376,"context_line":"    }),"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_fc7202ad","line":373,"range":{"start_line":373,"start_character":0,"end_line":373,"end_character":14},"updated":"2019-10-08 17:02:42.000000000","message":"I was trying to stop this redirecting also[1] but lost the progress. But  we can do that later.\n\n[1] https://review.opendev.org/#/c/580544/3\nML- http://lists.openstack.org/pipermail/openstack/2018-July/046699.html","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a2a17e77948b930a6ed6772c827f64491d4dc260","unresolved":false,"context_lines":[{"line_number":370,"context_line":"ROUTE_LIST \u003d ("},{"line_number":371,"context_line":"    # NOTE: This is a redirection from \u0027\u0027 to \u0027/\u0027. A request to \u0027\u0027 without the"},{"line_number":372,"context_line":"    # ending \u0027/\u0027 will get a response with status code \u0027302\u0027 returned."},{"line_number":373,"context_line":"    (\u0027\u0027, \u0027/\u0027),"},{"line_number":374,"context_line":"    (\u0027/\u0027, {"},{"line_number":375,"context_line":"        \u0027GET\u0027: [version_controller, \u0027show\u0027]"},{"line_number":376,"context_line":"    }),"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_9a42dd67","line":373,"range":{"start_line":373,"start_character":0,"end_line":373,"end_character":14},"in_reply_to":"3fa7e38b_08f0f966","updated":"2019-10-09 17:06:52.000000000","message":"i see. Let\u0027s wait for actual bug report for those. Existing bugs were for v2 and v2.1 redirect.","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59780d60cb4ff6978c074b54c5effdb47ec46ee8","unresolved":false,"context_lines":[{"line_number":370,"context_line":"ROUTE_LIST \u003d ("},{"line_number":371,"context_line":"    # NOTE: This is a redirection from \u0027\u0027 to \u0027/\u0027. A request to \u0027\u0027 without the"},{"line_number":372,"context_line":"    # ending \u0027/\u0027 will get a response with status code \u0027302\u0027 returned."},{"line_number":373,"context_line":"    (\u0027\u0027, \u0027/\u0027),"},{"line_number":374,"context_line":"    (\u0027/\u0027, {"},{"line_number":375,"context_line":"        \u0027GET\u0027: [version_controller, \u0027show\u0027]"},{"line_number":376,"context_line":"    }),"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_08f0f966","line":373,"range":{"start_line":373,"start_character":0,"end_line":373,"end_character":14},"in_reply_to":"3fa7e38b_fc7202ad","updated":"2019-10-08 17:15:46.000000000","message":"There were several patches we recently abandoned attempting to do the same.\n\nI believe this route (and the next) is unreachable if you use the updated paste.ini with the code in this patch. But we need to keep it here for backward compat with old paste.inis.","commit_id":"dc3fb68ff3beb3395608211e7f5163c41a563710"}],"nova/api/openstack/urlmap.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1ab557affc85cbcb09365e4922ba1accc46d6cae","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            # NOTE(efried): This assumes we\u0027ll never need a path URI component"},{"line_number":177,"context_line":"            #               that legitimately starts with \u0027+\u0027. (We could use a"},{"line_number":178,"context_line":"            #               more obscure character/sequence here in that case.)"},{"line_number":179,"context_line":"            if app_url.endswith(\u0027/+\u0027):"},{"line_number":180,"context_line":"                # Must be requesting at least the path element (including /)"},{"line_number":181,"context_line":"                if not path_info.startswith(app_url[:-1]):"},{"line_number":182,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_e9fcaa3f","line":179,"updated":"2019-10-05 09:52:52.000000000","message":"Since the unitest https://github.com/openstack/nova/blob/master/nova/tests/unit/api/openstack/compute/test_urlmap.py depends on fakes.wsgi_app_v21, then we should make it use this wildcard mode https://github.com/openstack/nova/blob/master/nova/tests/unit/api/openstack/fakes.py#L81, then we can ensure it is tested.","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e5f46ea4c79968f73953e19132b54c03a8b094e2","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            # NOTE(efried): This assumes we\u0027ll never need a path URI component"},{"line_number":177,"context_line":"            #               that legitimately starts with \u0027+\u0027. (We could use a"},{"line_number":178,"context_line":"            #               more obscure character/sequence here in that case.)"},{"line_number":179,"context_line":"            if app_url.endswith(\u0027/+\u0027):"},{"line_number":180,"context_line":"                # Must be requesting at least the path element (including /)"},{"line_number":181,"context_line":"                if not path_info.startswith(app_url[:-1]):"},{"line_number":182,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_336f80fd","line":179,"in_reply_to":"3fa7e38b_e9fcaa3f","updated":"2019-10-07 14:29:51.000000000","message":"Done","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1ab557affc85cbcb09365e4922ba1accc46d6cae","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                if len(path_info) \u003c len(app_url):"},{"line_number":185,"context_line":"                    continue"},{"line_number":186,"context_line":"                # Trim the /+ off the app_url to make it look \"normal\" for e.g."},{"line_number":187,"context_line":"                # proper splitting of SCRIPT_NAME and PATH_INFO."},{"line_number":188,"context_line":"                return app, app_url[:-2]"},{"line_number":189,"context_line":"            # Normal (non-wildcarded) prefix match"},{"line_number":190,"context_line":"            if (path_info \u003d\u003d app_url or"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_09f82647","line":187,"updated":"2019-10-05 09:52:52.000000000","message":"Maybe add some test ensure the SCRIPT_NAME and PATH_INFO is right https://github.com/openstack/nova/blob/master/nova/tests/unit/api/openstack/compute/test_urlmap.py","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e5f46ea4c79968f73953e19132b54c03a8b094e2","unresolved":false,"context_lines":[{"line_number":184,"context_line":"                if len(path_info) \u003c len(app_url):"},{"line_number":185,"context_line":"                    continue"},{"line_number":186,"context_line":"                # Trim the /+ off the app_url to make it look \"normal\" for e.g."},{"line_number":187,"context_line":"                # proper splitting of SCRIPT_NAME and PATH_INFO."},{"line_number":188,"context_line":"                return app, app_url[:-2]"},{"line_number":189,"context_line":"            # Normal (non-wildcarded) prefix match"},{"line_number":190,"context_line":"            if (path_info \u003d\u003d app_url or"}],"source_content_type":"text/x-python","patch_set":7,"id":"3fa7e38b_f37008dd","line":187,"in_reply_to":"3fa7e38b_09f82647","updated":"2019-10-07 14:29:51.000000000","message":"Done","commit_id":"46af2de023b7f7039bd1d015b8578567d5e267da"}],"nova/tests/unit/api/openstack/compute/test_versions.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0e14bed3389cefd67b19a425840c806966f0e12b","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        ]"},{"line_number":142,"context_line":"        self.assertEqual(expected, versions)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_get_version_list_302(self):"},{"line_number":145,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2\u0027)"},{"line_number":146,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":147,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":148,"context_line":"        self.assertEqual(302, res.status_int)"},{"line_number":149,"context_line":"        redirect_req \u003d fakes.HTTPRequest.blank(\u0027/v2/\u0027)"},{"line_number":150,"context_line":"        self.assertEqual(redirect_req.url, res.location)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _test_get_version_2_detail(self, url, accept\u003dNone):"},{"line_number":153,"context_line":"        if accept is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_021a187c","side":"PARENT","line":150,"range":{"start_line":144,"start_character":0,"end_line":150,"end_character":56},"updated":"2019-10-08 17:02:42.000000000","message":"or we could convert these into negative tests to verify that without \u0027/\u0027 is not redirected.","commit_id":"e33d270cd92b9c3a2be375d00aaebeb49adfb673"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59780d60cb4ff6978c074b54c5effdb47ec46ee8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        ]"},{"line_number":142,"context_line":"        self.assertEqual(expected, versions)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_get_version_list_302(self):"},{"line_number":145,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2\u0027)"},{"line_number":146,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":147,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":148,"context_line":"        self.assertEqual(302, res.status_int)"},{"line_number":149,"context_line":"        redirect_req \u003d fakes.HTTPRequest.blank(\u0027/v2/\u0027)"},{"line_number":150,"context_line":"        self.assertEqual(redirect_req.url, res.location)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _test_get_version_2_detail(self, url, accept\u003dNone):"},{"line_number":153,"context_line":"        if accept is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c89e6106","side":"PARENT","line":150,"range":{"start_line":144,"start_character":0,"end_line":150,"end_character":56},"in_reply_to":"3fa7e38b_021a187c","updated":"2019-10-08 17:15:46.000000000","message":"That\u0027s covered by the new tests at [1] (see the ddt data at L61 and L63).\n\n[1] https://review.opendev.org/#/c/685181/10/nova/tests/functional/api_sample_tests/test_versions.py@61","commit_id":"e33d270cd92b9c3a2be375d00aaebeb49adfb673"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a2a17e77948b930a6ed6772c827f64491d4dc260","unresolved":false,"context_lines":[{"line_number":141,"context_line":"        ]"},{"line_number":142,"context_line":"        self.assertEqual(expected, versions)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_get_version_list_302(self):"},{"line_number":145,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2\u0027)"},{"line_number":146,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":147,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":148,"context_line":"        self.assertEqual(302, res.status_int)"},{"line_number":149,"context_line":"        redirect_req \u003d fakes.HTTPRequest.blank(\u0027/v2/\u0027)"},{"line_number":150,"context_line":"        self.assertEqual(redirect_req.url, res.location)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def _test_get_version_2_detail(self, url, accept\u003dNone):"},{"line_number":153,"context_line":"        if accept is None:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c93c11e3","side":"PARENT","line":150,"range":{"start_line":144,"start_character":0,"end_line":150,"end_character":56},"in_reply_to":"3fa7e38b_c89e6106","updated":"2019-10-09 17:06:52.000000000","message":"oh functional tests were getting 200 even before these and 685181 changes also. they were always doing request with \u0027/\u0027 in url end?","commit_id":"e33d270cd92b9c3a2be375d00aaebeb49adfb673"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0e14bed3389cefd67b19a425840c806966f0e12b","unresolved":false,"context_lines":[{"line_number":448,"context_line":"    def wsgi_app(self):"},{"line_number":449,"context_line":"        return fakes.wsgi_app_v21()"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def test_get_version_list_302(self):"},{"line_number":452,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2.1\u0027)"},{"line_number":453,"context_line":"        req.accept \u003d \"application/json\""},{"line_number":454,"context_line":"        res \u003d req.get_response(self.wsgi_app)"},{"line_number":455,"context_line":"        self.assertEqual(302, res.status_int)"},{"line_number":456,"context_line":"        redirect_req \u003d fakes.HTTPRequest.blank(\u0027/v2.1/\u0027)"},{"line_number":457,"context_line":"        self.assertEqual(redirect_req.url, res.location)"},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"    def test_get_version_21_detail(self):"},{"line_number":460,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2.1/\u0027, base_url\u003d\u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3fa7e38b_c213a065","side":"PARENT","line":457,"range":{"start_line":451,"start_character":0,"end_line":457,"end_character":56},"updated":"2019-10-08 17:02:42.000000000","message":"ditto","commit_id":"e33d270cd92b9c3a2be375d00aaebeb49adfb673"}]}
