)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Matthew Oliver \u003cmatt@oliver.net.au\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-03-31 16:53:28 +1100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ic: Remove allow_modify_pipeline option and check for gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The internal client is suppose to be internal to the cluster, and as"},{"line_number":10,"context_line":"such we rely on it to not remove any headers we decide to send. However"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"93b2bee4_23e96aa8","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":2},"updated":"2023-03-31 15:27:04.000000000","message":"nit: for consistency with your other patch, and for usefulness to the reader, \u0027internal_client\u0027 would be better :) I think it would be ok to drop \u0027check for gatekeeper\u0027 as a trade-off","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7629ade247049e64dcd53b735da33de5c9d8d5e2","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Matthew Oliver \u003cmatt@oliver.net.au\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-03-31 16:53:28 +1100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ic: Remove allow_modify_pipeline option and check for gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The internal client is suppose to be internal to the cluster, and as"},{"line_number":10,"context_line":"such we rely on it to not remove any headers we decide to send. However"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"6649a7ca_83308546","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":2},"in_reply_to":"93b2bee4_23e96aa8","updated":"2023-04-03 07:06:29.000000000","message":"Done","commit_id":"72386170d94b036117d52745a172653b27e055b7"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5db577fe_0dfaee68","updated":"2023-03-31 15:27:04.000000000","message":"I\u0027m ok with this change, but -1 for not providing some backwards compatibility with **kwargs.\n\nI think I also prefer to avoid relying on \u0027app\u0027 attribute naming convention (I know it is pretty universal, but...) so I suggested https://review.opendev.org/c/openstack/swift/+/879167 ","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6af402f569ba359b13316bb9a9abe7be8e3faadc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"92b8d2e8_c0a6c711","updated":"2023-04-14 09:56:04.000000000","message":"I think the follow-on https://review.opendev.org/c/openstack/swift/+/880474 would be good too.\n\nLeaving for Tim to have a say.","commit_id":"e5105ffa09f7919cf27fa9f70aecbc98e53536aa"}],"swift/common/internal_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":true,"context_lines":[{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __init__(self, conf_path, user_agent, request_tries,"},{"line_number":156,"context_line":"                 use_replication_network\u003dFalse, global_conf\u003dNone, app\u003dNone):"},{"line_number":157,"context_line":"        if request_tries \u003c 1:"},{"line_number":158,"context_line":"            raise ValueError(\u0027request_tries must be positive\u0027)"},{"line_number":159,"context_line":"        # Internal clients don\u0027t use the gatekeeper and the pipeline remains"}],"source_content_type":"text/x-python","patch_set":1,"id":"416da6d3_31d62123","line":156,"updated":"2023-03-31 15:27:04.000000000","message":"do you think we might add **kwargs, in case a 3rd party is constructing InternalClient and explicitly passing allow_modify_pipeline\u003dFalse?\n\n(asking for a friend)","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7629ade247049e64dcd53b735da33de5c9d8d5e2","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __init__(self, conf_path, user_agent, request_tries,"},{"line_number":156,"context_line":"                 use_replication_network\u003dFalse, global_conf\u003dNone, app\u003dNone):"},{"line_number":157,"context_line":"        if request_tries \u003c 1:"},{"line_number":158,"context_line":"            raise ValueError(\u0027request_tries must be positive\u0027)"},{"line_number":159,"context_line":"        # Internal clients don\u0027t use the gatekeeper and the pipeline remains"}],"source_content_type":"text/x-python","patch_set":1,"id":"67c94e3e_bb292c21","line":156,"in_reply_to":"416da6d3_31d62123","updated":"2023-04-03 07:06:29.000000000","message":"lol, good idea. Don\u0027t want to break anything for people using internal client outside of swift, gotta treat our friends well 😊","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"56fda22ef542dd5962af55943843b37a459a2030","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __init__(self, conf_path, user_agent, request_tries,"},{"line_number":156,"context_line":"                 use_replication_network\u003dFalse, global_conf\u003dNone, app\u003dNone):"},{"line_number":157,"context_line":"        if request_tries \u003c 1:"},{"line_number":158,"context_line":"            raise ValueError(\u0027request_tries must be positive\u0027)"},{"line_number":159,"context_line":"        # Internal clients don\u0027t use the gatekeeper and the pipeline remains"}],"source_content_type":"text/x-python","patch_set":1,"id":"dc1ca18a_9e0e2d44","line":156,"in_reply_to":"67c94e3e_bb292c21","updated":"2023-04-03 18:59:55.000000000","message":"Or we just keep the existing signature and document that the arg is deprecated/ignored -- IDK that I love the idea of adding `**kwargs` to a signature to preserve compatibility, especially since it doesn\u0027t help if the caller used positional args.\n\nOne question remains, though: what should we do if the caller explicitly said `allow_modify_pipeline\u003dTrue`? I see a few options:\n\n- Silently ignore it.\n- Ignore it, but log a warning.\n- Raise an exception.\n\nI\u0027m leaning toward that last one, given the error we raise if it was explicitly configured.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6af402f569ba359b13316bb9a9abe7be8e3faadc","unresolved":false,"context_lines":[{"line_number":153,"context_line":"    \"\"\""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def __init__(self, conf_path, user_agent, request_tries,"},{"line_number":156,"context_line":"                 use_replication_network\u003dFalse, global_conf\u003dNone, app\u003dNone):"},{"line_number":157,"context_line":"        if request_tries \u003c 1:"},{"line_number":158,"context_line":"            raise ValueError(\u0027request_tries must be positive\u0027)"},{"line_number":159,"context_line":"        # Internal clients don\u0027t use the gatekeeper and the pipeline remains"}],"source_content_type":"text/x-python","patch_set":1,"id":"53317f0f_41ea7cd3","line":156,"in_reply_to":"dc1ca18a_9e0e2d44","updated":"2023-04-14 09:56:04.000000000","message":"I\u0027m inclined to agree with Tim w.r.t. raising an exception: we\u0027ve removed a defence that the caller previously assumed, so it doesn\u0027t seem \u0027safe\u0027 to proceed silently, or even with a warning that could be missed. A ValueError is also consistent with the case where the pipeline had been configured with gatekeeper middleware.\n\nSee follow-on https://review.opendev.org/c/openstack/swift/+/880474","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        if self.is_gatekeeper_loaded(self.app):"},{"line_number":164,"context_line":"            raise ValueError("},{"line_number":165,"context_line":"                \"Gatekeeper middleware is not allowed in the \""},{"line_number":166,"context_line":"                \"internalclient proxy pipeline\")"},{"line_number":167,"context_line":"        self.user_agent \u003d \\"},{"line_number":168,"context_line":"            self.app._pipeline_final_app.backend_user_agent \u003d user_agent"},{"line_number":169,"context_line":"        self.request_tries \u003d request_tries"}],"source_content_type":"text/x-python","patch_set":1,"id":"d27affff_846a9919","line":166,"range":{"start_line":166,"start_character":17,"end_line":166,"end_character":31},"updated":"2023-03-31 15:27:04.000000000","message":"should this be either \"InternalClient\" (my preference) or \"internal client\"","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4fe938c00a6ae438ef0926c8ba1f443d825e3f8","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        if self.is_gatekeeper_loaded(self.app):"},{"line_number":164,"context_line":"            raise ValueError("},{"line_number":165,"context_line":"                \"Gatekeeper middleware is not allowed in the \""},{"line_number":166,"context_line":"                \"internalclient proxy pipeline\")"},{"line_number":167,"context_line":"        self.user_agent \u003d \\"},{"line_number":168,"context_line":"            self.app._pipeline_final_app.backend_user_agent \u003d user_agent"},{"line_number":169,"context_line":"        self.request_tries \u003d request_tries"}],"source_content_type":"text/x-python","patch_set":1,"id":"f06a8dda_d4aaa445","line":166,"range":{"start_line":166,"start_character":17,"end_line":166,"end_character":31},"in_reply_to":"9d504e8d_9c2a5e0e","updated":"2023-04-14 06:18:34.000000000","message":"Done","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7629ade247049e64dcd53b735da33de5c9d8d5e2","unresolved":true,"context_lines":[{"line_number":163,"context_line":"        if self.is_gatekeeper_loaded(self.app):"},{"line_number":164,"context_line":"            raise ValueError("},{"line_number":165,"context_line":"                \"Gatekeeper middleware is not allowed in the \""},{"line_number":166,"context_line":"                \"internalclient proxy pipeline\")"},{"line_number":167,"context_line":"        self.user_agent \u003d \\"},{"line_number":168,"context_line":"            self.app._pipeline_final_app.backend_user_agent \u003d user_agent"},{"line_number":169,"context_line":"        self.request_tries \u003d request_tries"}],"source_content_type":"text/x-python","patch_set":1,"id":"9d504e8d_9c2a5e0e","line":166,"range":{"start_line":166,"start_character":17,"end_line":166,"end_character":31},"in_reply_to":"d27affff_846a9919","updated":"2023-04-03 07:06:29.000000000","message":"I think you fix this in our follow up so will leave it for now.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"56fda22ef542dd5962af55943843b37a459a2030","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        self.auto_create_account_prefix \u003d \\"},{"line_number":175,"context_line":"            self.app._pipeline_final_app.auto_create_account_prefix"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @staticmethod"},{"line_number":178,"context_line":"    def is_gatekeeper_loaded(app):"},{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"128ad53a_77465dae","line":177,"updated":"2023-04-03 18:59:55.000000000","message":"I\u0027m not sure what we get out of using a `staticmethod` -- couldn\u0027t we just say\n\n if self.gatekeeper_is_loaded():\n\nand pick out `self.app` in the method?","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"8112c72daa04d8a1c18d2e8585c81a70f3fd5522","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        self.auto_create_account_prefix \u003d \\"},{"line_number":175,"context_line":"            self.app._pipeline_final_app.auto_create_account_prefix"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @staticmethod"},{"line_number":178,"context_line":"    def is_gatekeeper_loaded(app):"},{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"86cf761c_c20659da","line":177,"in_reply_to":"128ad53a_77465dae","updated":"2023-04-04 00:36:22.000000000","message":"Not much, just made it easier to test because it allowed me to call the function directly without having to make an internal_client, but happy to change it and just do it properly :P","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4fe938c00a6ae438ef0926c8ba1f443d825e3f8","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        self.auto_create_account_prefix \u003d \\"},{"line_number":175,"context_line":"            self.app._pipeline_final_app.auto_create_account_prefix"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @staticmethod"},{"line_number":178,"context_line":"    def is_gatekeeper_loaded(app):"},{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"48a30667_e72bbaea","line":177,"in_reply_to":"12d61d30_10bbe82c","updated":"2023-04-14 06:18:34.000000000","message":"I agree staticmethod was to make testing easier, and it\u0027s pretty straight forward. But wont resolve this conversation incase Tim wants to weigh in.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3ece01e3987a386794b8527d193d0db5de7619e8","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        self.auto_create_account_prefix \u003d \\"},{"line_number":175,"context_line":"            self.app._pipeline_final_app.auto_create_account_prefix"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @staticmethod"},{"line_number":178,"context_line":"    def is_gatekeeper_loaded(app):"},{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d7f48803_cc03d38e","line":177,"in_reply_to":"48a30667_e72bbaea","updated":"2023-04-14 15:59:55.000000000","message":"Making testing easier is a fine reason for it. It just struck me as odd that the one and only place we call this (from code under swift/) has\n\n    self.check_gatekeeper_not_loaded(self.app)\n\n(i.e. we\u0027re calling it like a bound method with an instance in hand, then explicitly passing in an instance attribute, and never expecting to need to pass any *other* app)\n\nIf the caller instead looked like\n\n    self.check_gatekeeper_not_loaded()\n\nor\n\n    check_gatekeeper_not_loaded(self.app)\n\nI don\u0027t think I would\u0027ve batted an eye at it.\n\nEase of testing is a perfectly reasonable excuse, though, and I\u0027m not *opposed* to having this dangling off `InternalClient`.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cd268c98b94c1f7640721679be0f480fb8e3812b","unresolved":true,"context_lines":[{"line_number":174,"context_line":"        self.auto_create_account_prefix \u003d \\"},{"line_number":175,"context_line":"            self.app._pipeline_final_app.auto_create_account_prefix"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @staticmethod"},{"line_number":178,"context_line":"    def is_gatekeeper_loaded(app):"},{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"12d61d30_10bbe82c","line":177,"in_reply_to":"86cf761c_c20659da","updated":"2023-04-04 14:29:36.000000000","message":"what\u0027s wrong with staticmethod? it makes unit testing a lot easier, and my IDE actually warns me about bound methods that could be static or class methods.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"},{"line_number":181,"context_line":"                return True"},{"line_number":182,"context_line":"            elif hasattr(app, \u0027app\u0027):"},{"line_number":183,"context_line":"                return check_app(app.app)"},{"line_number":184,"context_line":"            return False"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"213050b3_4d7475c1","line":182,"range":{"start_line":182,"start_character":12,"end_line":182,"end_character":37},"updated":"2023-03-31 15:27:04.000000000","message":"It\u0027s not great that we rely on the convention that filters always stash the next filter as an attribute \u0027app\u0027.\n\nI wonder if we should finally get round to stashing the pipeline in every filter (just like we stashed the _pipeline_final_app)?","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"7629ade247049e64dcd53b735da33de5c9d8d5e2","unresolved":true,"context_lines":[{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"},{"line_number":181,"context_line":"                return True"},{"line_number":182,"context_line":"            elif hasattr(app, \u0027app\u0027):"},{"line_number":183,"context_line":"                return check_app(app.app)"},{"line_number":184,"context_line":"            return False"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2a14b92e_77bb5b87","line":182,"range":{"start_line":182,"start_character":12,"end_line":182,"end_character":37},"in_reply_to":"213050b3_4d7475c1","updated":"2023-04-03 07:06:29.000000000","message":"yeah, I did cringe when I added the hasattr there.","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4fe938c00a6ae438ef0926c8ba1f443d825e3f8","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        def check_app(app):"},{"line_number":180,"context_line":"            if app.__class__.__name__ \u003d\u003d \u0027GatekeeperMiddleware\u0027:"},{"line_number":181,"context_line":"                return True"},{"line_number":182,"context_line":"            elif hasattr(app, \u0027app\u0027):"},{"line_number":183,"context_line":"                return check_app(app.app)"},{"line_number":184,"context_line":"            return False"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8169fbce_72152a42","line":182,"range":{"start_line":182,"start_character":12,"end_line":182,"end_character":37},"in_reply_to":"2a14b92e_77bb5b87","updated":"2023-04-14 06:18:34.000000000","message":"Done","commit_id":"72386170d94b036117d52745a172653b27e055b7"}],"test/unit/common/test_internal_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4eb35ecde604b8f3d275e7e42ac57a62ada6b7ee","unresolved":true,"context_lines":[{"line_number":393,"context_line":"                conf_path, user_agent, request_tries\u003d0)"},{"line_number":394,"context_line":"        mock_loadapp.assert_not_called()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # if we load it with the gatekeepr middleware then we also get a"},{"line_number":397,"context_line":"        # value error"},{"line_number":398,"context_line":"        gate_keeper_app \u003d GatekeeperMiddleware(app, {})"},{"line_number":399,"context_line":"        gate_keeper_app._pipeline_final_app \u003d app"}],"source_content_type":"text/x-python","patch_set":1,"id":"15ec0f56_1524728d","line":396,"range":{"start_line":396,"start_character":33,"end_line":396,"end_character":42},"updated":"2023-03-31 15:27:04.000000000","message":"nit: typo","commit_id":"72386170d94b036117d52745a172653b27e055b7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"a4fe938c00a6ae438ef0926c8ba1f443d825e3f8","unresolved":false,"context_lines":[{"line_number":393,"context_line":"                conf_path, user_agent, request_tries\u003d0)"},{"line_number":394,"context_line":"        mock_loadapp.assert_not_called()"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        # if we load it with the gatekeepr middleware then we also get a"},{"line_number":397,"context_line":"        # value error"},{"line_number":398,"context_line":"        gate_keeper_app \u003d GatekeeperMiddleware(app, {})"},{"line_number":399,"context_line":"        gate_keeper_app._pipeline_final_app \u003d app"}],"source_content_type":"text/x-python","patch_set":1,"id":"ab6a180e_683eb363","line":396,"range":{"start_line":396,"start_character":33,"end_line":396,"end_character":42},"in_reply_to":"15ec0f56_1524728d","updated":"2023-04-14 06:18:34.000000000","message":"Done","commit_id":"72386170d94b036117d52745a172653b27e055b7"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6af402f569ba359b13316bb9a9abe7be8e3faadc","unresolved":true,"context_lines":[{"line_number":1645,"context_line":"            exp_pipeline \u003d [app, app.app, app.app.app]"},{"line_number":1646,"context_line":"            self.assertEqual(exp_pipeline, app._pipeline)"},{"line_number":1647,"context_line":"            self.assertEqual(exp_pipeline, app.app._pipeline)"},{"line_number":1648,"context_line":"            self.assertEqual(exp_pipeline, app.app.app._pipeline)"},{"line_number":1649,"context_line":""},{"line_number":1650,"context_line":"            # make sure you can turn off the pipeline modification if you want"},{"line_number":1651,"context_line":"            def blow_up(*_, **__):"}],"source_content_type":"text/x-python","patch_set":4,"id":"da7e0284_97f72ef1","line":1648,"updated":"2023-04-14 09:56:04.000000000","message":"Tim had suggested some more assertions here - will fix","commit_id":"fb37ad742b0712f47292185c235c4453b5886d61"}]}
