)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Capture relevant items from the request environ as part of"},{"line_number":10,"context_line":"FakeSwiftCall and use that to query captured txn_ids, sources rather"},{"line_number":11,"context_line":"than maintaining separate lists for each request property."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Store captured request body as an attribute of FakeSwiftCall to"},{"line_number":14,"context_line":"similarly avoid maintaining another list. The request body is read"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"8ddda8c0_8e9da3c5","line":11,"updated":"2025-02-12 14:58:52.000000000","message":"I don\u0027t see where these were being used?!  I\u0027m confused/skeptical about the specific white list of environ keys.","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Capture relevant items from the request environ as part of"},{"line_number":10,"context_line":"FakeSwiftCall and use that to query captured txn_ids, sources rather"},{"line_number":11,"context_line":"than maintaining separate lists for each request property."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Store captured request body as an attribute of FakeSwiftCall to"},{"line_number":14,"context_line":"similarly avoid maintaining another list. The request body is read"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bd9edbf0_5e4b1829","line":11,"in_reply_to":"8ddda8c0_8e9da3c5","updated":"2025-02-13 14:59:45.000000000","message":"they are used, for example https://github.com/openstack/swift/blob/128124cdd8ca09136d4988affd1bb8c5c1361fc1/test/unit/common/middleware/test_object_versioning.py#L607","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":13,"context_line":"Store captured request body as an attribute of FakeSwiftCall to"},{"line_number":14,"context_line":"similarly avoid maintaining another list. The request body is read"},{"line_number":15,"context_line":"after the FakeSwiftCall has been captured in case there is an error"},{"line_number":16,"context_line":"while reading."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Drive-by: drop footers arg from FakeSwiftCall constructor since it is"},{"line_number":19,"context_line":"never used, nor should it be used."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"a1e97169_507d7106","line":16,"updated":"2025-02-12 14:58:52.000000000","message":"I love this part!  Removing `.req_bodies` was a nice cleanup.  Love `FakeSwiftCall`!!!","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Store captured request body as an attribute of FakeSwiftCall to"},{"line_number":14,"context_line":"similarly avoid maintaining another list. The request body is read"},{"line_number":15,"context_line":"after the FakeSwiftCall has been captured in case there is an error"},{"line_number":16,"context_line":"while reading."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Drive-by: drop footers arg from FakeSwiftCall constructor since it is"},{"line_number":19,"context_line":"never used, nor should it be used."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f90e48c_730946a3","line":16,"in_reply_to":"a1e97169_507d7106","updated":"2025-02-13 14:59:45.000000000","message":"Acknowledged","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":16,"context_line":"while reading."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Drive-by: drop footers arg from FakeSwiftCall constructor since it is"},{"line_number":19,"context_line":"never used, nor should it be used."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Related-Change: If24b6fa50f1d67a7bbbf9a1794c70d37c41971f7"},{"line_number":22,"context_line":"Change-Id: I332ce724aa10287800cbec8ca21aacc3bbd3c22a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"317bde5b_53192cee","line":19,"updated":"2025-02-12 14:58:52.000000000","message":"heh, nice - the comment helps too.","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"while reading."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Drive-by: drop footers arg from FakeSwiftCall constructor since it is"},{"line_number":19,"context_line":"never used, nor should it be used."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Related-Change: If24b6fa50f1d67a7bbbf9a1794c70d37c41971f7"},{"line_number":22,"context_line":"Change-Id: I332ce724aa10287800cbec8ca21aacc3bbd3c22a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7653fb22_3f59ad4d","line":19,"in_reply_to":"317bde5b_53192cee","updated":"2025-02-13 14:59:45.000000000","message":"Acknowledged","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e063be35_25a04fa7","updated":"2025-02-12 14:58:52.000000000","message":"Change seems like an overall improvement - but 1/3 of the change bullets listed in the commit seems less obviously pragmatic than the others.  I assume growing the env attribute is a good idea; but I\u0027m not 100% how that should look without some use-case(s) in tests.","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9412e0368912bf7da5e68059b1707c2129e516cc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8af9da18_5ac3cc12","updated":"2025-03-03 06:12:29.000000000","message":"Yup, I\u0027m onboard this this. Great cleanup. And even makes the tests more readable (in my opinion).","commit_id":"ceff47d7af9079c5c815d83663b3ab12eba23e60"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1473b14bcf5a019c7134ad213a1677268b838562","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0fa4f94b_0b990df2","updated":"2025-03-06 21:11:58.000000000","message":"i had started to review this and had some unpublished (positive?) draft comments - but it looks like I was already +2 once before and matt has since +2\u0027d\n\nLet\u0027s just merge it - it\u0027s test only; how bad could it be!?  ;)\n\nThanks Al!","commit_id":"ceff47d7af9079c5c815d83663b3ab12eba23e60"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":133,"context_line":"    def __init__(self, capture_unexpected_calls\u003dTrue):"},{"line_number":134,"context_line":"        self.capture_unexpected_calls \u003d capture_unexpected_calls"},{"line_number":135,"context_line":"        self._calls \u003d []"},{"line_number":136,"context_line":"        self.req_bodies \u003d []"},{"line_number":137,"context_line":"        self._unclosed_req_keys \u003d defaultdict(int)"},{"line_number":138,"context_line":"        self._unread_req_paths \u003d defaultdict(int)"},{"line_number":139,"context_line":"        self.req_method_paths \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"47b7ecd8_76260401","side":"PARENT","line":136,"updated":"2025-02-12 14:58:52.000000000","message":"nice!  additional standardization.","commit_id":"747b2a4a328b62585444de37f96921b1401bf565"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    def __init__(self, capture_unexpected_calls\u003dTrue):"},{"line_number":134,"context_line":"        self.capture_unexpected_calls \u003d capture_unexpected_calls"},{"line_number":135,"context_line":"        self._calls \u003d []"},{"line_number":136,"context_line":"        self.req_bodies \u003d []"},{"line_number":137,"context_line":"        self._unclosed_req_keys \u003d defaultdict(int)"},{"line_number":138,"context_line":"        self._unread_req_paths \u003d defaultdict(int)"},{"line_number":139,"context_line":"        self.req_method_paths \u003d []"}],"source_content_type":"text/x-python","patch_set":1,"id":"dad8934b_6c63ca8f","side":"PARENT","line":136,"in_reply_to":"47b7ecd8_76260401","updated":"2025-02-13 14:59:45.000000000","message":"Acknowledged","commit_id":"747b2a4a328b62585444de37f96921b1401bf565"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":138,"context_line":"        self._unread_req_paths \u003d defaultdict(int)"},{"line_number":139,"context_line":"        self.req_method_paths \u003d []"},{"line_number":140,"context_line":"        self.swift_sources \u003d []"},{"line_number":141,"context_line":"        self.txn_ids \u003d []"},{"line_number":142,"context_line":"        self.uploaded \u003d {}"},{"line_number":143,"context_line":"        # mapping of (method, path) --\u003e (response class, headers, body)"},{"line_number":144,"context_line":"        self._responses \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ae260b3_da483de9","side":"PARENT","line":141,"updated":"2025-02-12 14:58:52.000000000","message":"am I missing it in the diff?  Was no one using this?","commit_id":"747b2a4a328b62585444de37f96921b1401bf565"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":true,"context_lines":[{"line_number":138,"context_line":"        self._unread_req_paths \u003d defaultdict(int)"},{"line_number":139,"context_line":"        self.req_method_paths \u003d []"},{"line_number":140,"context_line":"        self.swift_sources \u003d []"},{"line_number":141,"context_line":"        self.txn_ids \u003d []"},{"line_number":142,"context_line":"        self.uploaded \u003d {}"},{"line_number":143,"context_line":"        # mapping of (method, path) --\u003e (response class, headers, body)"},{"line_number":144,"context_line":"        self._responses \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"87f45e29_905b8242","side":"PARENT","line":141,"in_reply_to":"3ae260b3_da483de9","updated":"2025-02-13 14:59:45.000000000","message":"swift_sources and txn_ids are now properties\n\nreq_method_paths was unused","commit_id":"747b2a4a328b62585444de37f96921b1401bf565"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":71,"context_line":"        self.headers \u003d HeaderKeyDict(req.headers)"},{"line_number":72,"context_line":"        # footers is populated if/when it is passed by FakeSwift to any"},{"line_number":73,"context_line":"        # update_footers callback that has been set in the request environment."},{"line_number":74,"context_line":"        self.footers \u003d HeaderKeyDict()"},{"line_number":75,"context_line":"        self.env \u003d {}"},{"line_number":76,"context_line":"        for key in self.REQ_ENVIRON_KEYS_TO_CAPTURE:"},{"line_number":77,"context_line":"            self.env[key] \u003d copy.deepcopy(req.environ.get(key))"}],"source_content_type":"text/x-python","patch_set":1,"id":"a637dbee_36427d6c","line":74,"updated":"2025-02-12 14:58:52.000000000","message":"this comment is helpful, and probably sufficient\n\nIf we wanted to make it really obvious and hard to get wrong we might extract the proxy obj controller method to a function:\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/obj.py#L772-L777\n\nthen just say\n\n```\n# PUT requests may set this if the req environ provides them\nself.footers \u003d None\n```\n\nand later\n```\ncall.footers \u003d obj_controller.get_footers(req)\n```","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1473b14bcf5a019c7134ad213a1677268b838562","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        self.headers \u003d HeaderKeyDict(req.headers)"},{"line_number":72,"context_line":"        # footers is populated if/when it is passed by FakeSwift to any"},{"line_number":73,"context_line":"        # update_footers callback that has been set in the request environment."},{"line_number":74,"context_line":"        self.footers \u003d HeaderKeyDict()"},{"line_number":75,"context_line":"        self.env \u003d {}"},{"line_number":76,"context_line":"        for key in self.REQ_ENVIRON_KEYS_TO_CAPTURE:"},{"line_number":77,"context_line":"            self.env[key] \u003d copy.deepcopy(req.environ.get(key))"}],"source_content_type":"text/x-python","patch_set":1,"id":"a0c10581_003a9d73","line":74,"in_reply_to":"a637dbee_36427d6c","updated":"2025-03-06 21:11:58.000000000","message":"this suggestion doesn\u0027t seem necessary for correctness, might not actually improve maintainability and could potentially have some unexplored downside when we try to import the proxy object controller into the fake swift module.","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1e1a18d3037aad82804f7e89342650a993c495a","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.footers \u003d HeaderKeyDict()"},{"line_number":75,"context_line":"        self.env \u003d {}"},{"line_number":76,"context_line":"        for key in self.REQ_ENVIRON_KEYS_TO_CAPTURE:"},{"line_number":77,"context_line":"            self.env[key] \u003d copy.deepcopy(req.environ.get(key))"},{"line_number":78,"context_line":"        # leave FakeSwift to read body and set this attribute after the call"},{"line_number":79,"context_line":"        # has been captured"},{"line_number":80,"context_line":"        self.body \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"e28b04d8_cfe5ab2e","line":77,"updated":"2025-02-12 14:58:52.000000000","message":"I feel like while the keys_to_capture list is small tests are going to write:\n\n```\nassert [expected_env] * num_expected \u003d\u003d [c.env for c in swift.call_list]\n```\n\n... and have to get updated when we extend the capture list\n\nAre we sure we can\u0027t just make a keys_to_skip black list to start?\n\nIf a test wants the \"interesting keys\" behavior we could probably add a `c.sub_env(*keys)` helper that returns `{k: self.env.get(k) for k in keys}`\n\nOr I suppose we could update any tests asserting on the full environ to spell that out the specific list of keys that existed in this list when they were written and then extend the base capture list to pay it forward...","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1473b14bcf5a019c7134ad213a1677268b838562","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        self.footers \u003d HeaderKeyDict()"},{"line_number":75,"context_line":"        self.env \u003d {}"},{"line_number":76,"context_line":"        for key in self.REQ_ENVIRON_KEYS_TO_CAPTURE:"},{"line_number":77,"context_line":"            self.env[key] \u003d copy.deepcopy(req.environ.get(key))"},{"line_number":78,"context_line":"        # leave FakeSwift to read body and set this attribute after the call"},{"line_number":79,"context_line":"        # has been captured"},{"line_number":80,"context_line":"        self.body \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"87c57666_8f0408c7","line":77,"in_reply_to":"85cec9fb_3dc3d491","updated":"2025-03-06 21:11:58.000000000","message":"\u003e and found some tests that created lots of requests got killed (memory bloat??)\n\noh bummer!  I wouldn\u0027t have expected that but it makes sense.  \"write down why we DIDN\u0027T do something\" comes up again!","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d98ed6c339f821a15395417d18a0b1c5a453ab6f","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        self.footers \u003d HeaderKeyDict()"},{"line_number":75,"context_line":"        self.env \u003d {}"},{"line_number":76,"context_line":"        for key in self.REQ_ENVIRON_KEYS_TO_CAPTURE:"},{"line_number":77,"context_line":"            self.env[key] \u003d copy.deepcopy(req.environ.get(key))"},{"line_number":78,"context_line":"        # leave FakeSwift to read body and set this attribute after the call"},{"line_number":79,"context_line":"        # has been captured"},{"line_number":80,"context_line":"        self.body \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"85cec9fb_3dc3d491","line":77,"in_reply_to":"e28b04d8_cfe5ab2e","updated":"2025-02-13 14:59:45.000000000","message":"oh that\u0027s a good point about tests starting to be brittle about what they expect in the sampled env - it\u0027s similar to the problem there was with the namedtuple\n\nwill fix, somehow\n\nFWIW I tried to deepcopy the whole env except those items that wouldn\u0027t deepcopy and found some tests that created lots of requests got killed (memory bloat??)","commit_id":"4a9a8b6d28a677380e93a3d06e405b7d1569fdcd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"46e0777965eb4abec3dbc8bca86971adcc5a180f","unresolved":true,"context_lines":[{"line_number":105,"context_line":"        ``FakeSwiftCall.env`` can access the original request environ via"},{"line_number":106,"context_line":"        ``FakeSwiftCall.req.environ``."},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        return self._env"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"def normalize_query_string(qs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"1126694f_3a632cb1","line":108,"updated":"2025-02-13 15:39:59.000000000","message":"I struggled to find any way of tackling this that I really liked.\n\nThe advantages of this approach are at least:\n- no need for white/black lists\n- no ambiguity as to whether a value in env has been copied or not\n- copying more of the env is a dis-incentive to writing ``self.assertEqual(expected_dict, env)`` [1]\n- req.environ is still available\n- no need to touch FakeSwift when new env items are added e.g. you can write ``self.assertEqual([\u0027a\u0027, \u0027c\u0027, \u0027o\u0027], call.env[\u0027swift.path_parts\u0027])`` and such like without needing to touch FakeSwift.\n\nThe disadvantages are:\n- devs may be surprised by DUMMY_VALUE (but will hopefully soon realise why)\n- I had to write a stupid recursive selective copy\n\nAlternatives considered:\n- using the original values when they can\u0027t be deep-copied - rejected because of the ambiguity\n- copying every key of interest from the ``req.environ`` to a ``FakeSwiftCall`` attribute - rejected because it requires updating for every new environ item we want to test, and because we\u0027d need to translate environ keys with periods, e.g. ``swift.source`` to ``FakeSwiftCall.swift_source``","commit_id":"11eee8741ca16cd25fcc2feb704d7c2340750377"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9412e0368912bf7da5e68059b1707c2129e516cc","unresolved":true,"context_lines":[{"line_number":109,"context_line":"        ``self.assertEqual(expected, call.env)``) because those assertions will"},{"line_number":110,"context_line":"        break when new default keys are added to the request environ. Tests"},{"line_number":111,"context_line":"        should instead make assertions about individual items in ``env`` (e.g."},{"line_number":112,"context_line":"        ``self.assertEqual(expected, call.env[\u0027swift.source\u0027)``)."},{"line_number":113,"context_line":"        \"\"\""},{"line_number":114,"context_line":"        return self._env"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4728523b_8509d1d9","line":112,"updated":"2025-03-03 06:12:29.000000000","message":"Glad this comment exists, because I have no doubt I\u0027ll fall down this rabbit hole one day! Thanks!","commit_id":"ceff47d7af9079c5c815d83663b3ab12eba23e60"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9412e0368912bf7da5e68059b1707c2129e516cc","unresolved":true,"context_lines":[{"line_number":446,"context_line":""},{"line_number":447,"context_line":"    @property"},{"line_number":448,"context_line":"    def swift_sources(self):"},{"line_number":449,"context_line":"        return [call.env.get(\u0027swift.source\u0027) for call in self.call_list]"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def update_sticky_response_headers(self, path, headers):"},{"line_number":452,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9dfa8dc1_c3682b54","line":449,"updated":"2025-03-03 06:12:29.000000000","message":"Ahh, this is much cleaner, love it!","commit_id":"ceff47d7af9079c5c815d83663b3ab12eba23e60"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"9412e0368912bf7da5e68059b1707c2129e516cc","unresolved":true,"context_lines":[{"line_number":1508,"context_line":"            (\u0027DELETE\u0027, \u0027/v1/AUTH_test/bucket+segments/%s/X\u0027 % wsgi_snowman)"},{"line_number":1509,"context_line":"        ])"},{"line_number":1510,"context_line":""},{"line_number":1511,"context_line":"        self.assertEqual(json.loads(self.swift.call_list[-2].body), ["},{"line_number":1512,"context_line":"            {\"path\": u\"/bucket+segments/\\N{SNOWMAN}/X/1\","},{"line_number":1513,"context_line":"             \"etag\": \"0123456789abcdef0123456789abcdef\"},"},{"line_number":1514,"context_line":"            {\"path\": u\"/bucket+segments/\\N{SNOWMAN}/X/2\","}],"source_content_type":"text/x-python","patch_set":3,"id":"d66c383e_58e28c9b","line":1511,"updated":"2025-03-03 06:12:29.000000000","message":"This even reads better, call_list get the body. Now we know we basically just look at call objects for info on calls. Much better then a bunch of lists in FakeSwift.","commit_id":"ceff47d7af9079c5c815d83663b3ab12eba23e60"}]}
