)]}'
{"swift/obj/server.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":631,"context_line":"                resp_headers[key] \u003d value"},{"line_number":632,"context_line":"        for key, value in metadata.items():"},{"line_number":633,"context_line":"            if (is_user_meta(\u0027object\u0027, key) or"},{"line_number":634,"context_line":"                    is_object_transient_sysmeta(key)):"},{"line_number":635,"context_line":"                resp_headers[key] \u003d value"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        return HTTPAccepted(request\u003drequest, headers\u003dresp_headers)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_2e45cf6f","line":634,"updated":"2016-08-21 00:06:25.000000000","message":"I can remove the case for transient_sysmeta, and no unit tests fail","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":631,"context_line":"                resp_headers[key] \u003d value"},{"line_number":632,"context_line":"        for key, value in metadata.items():"},{"line_number":633,"context_line":"            if (is_user_meta(\u0027object\u0027, key) or"},{"line_number":634,"context_line":"                    is_object_transient_sysmeta(key)):"},{"line_number":635,"context_line":"                resp_headers[key] \u003d value"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        return HTTPAccepted(request\u003drequest, headers\u003dresp_headers)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_70cea2b5","line":634,"in_reply_to":"1ac06dbe_2e45cf6f","updated":"2016-08-26 00:47:11.000000000","message":"Done","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        for key, value in metadata.items():"},{"line_number":867,"context_line":"            if (is_sys_meta(\u0027object\u0027, key) or"},{"line_number":868,"context_line":"                    is_user_meta(\u0027object\u0027, key) or"},{"line_number":869,"context_line":"                    is_object_transient_sysmeta(key)):"},{"line_number":870,"context_line":"                resp_headers[key] \u003d value"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        return HTTPCreated(request\u003drequest, headers\u003dresp_headers, etag\u003detag)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_0e3f33d7","line":869,"updated":"2016-08-21 00:06:25.000000000","message":"Same as in POST: I can remove the case for transient_sysmeta, and no unit tests fail","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        for key, value in metadata.items():"},{"line_number":867,"context_line":"            if (is_sys_meta(\u0027object\u0027, key) or"},{"line_number":868,"context_line":"                    is_user_meta(\u0027object\u0027, key) or"},{"line_number":869,"context_line":"                    is_object_transient_sysmeta(key)):"},{"line_number":870,"context_line":"                resp_headers[key] \u003d value"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        return HTTPCreated(request\u003drequest, headers\u003dresp_headers, etag\u003detag)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_b0c01a7e","line":869,"in_reply_to":"1ac06dbe_0e3f33d7","updated":"2016-08-26 00:47:11.000000000","message":"Done","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # Turns out, fake_http_connect is rather liberal in what it sends back"},{"line_number":646,"context_line":"        for header, expected_value in resp_headers.items():"},{"line_number":647,"context_line":"            self.assertIn(header, resp.headers)"},{"line_number":648,"context_line":"            self.assertEqual(resp.headers[header], expected_value)"},{"line_number":649,"context_line":"        for connection_id, info in put_requests.items():"},{"line_number":650,"context_line":"            body \u003d \u0027\u0027.join(info[\u0027chunks\u0027])"},{"line_number":651,"context_line":"            headers \u003d info[\u0027headers\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_27c5f73b","line":648,"updated":"2016-08-21 00:06:25.000000000","message":"swap the args: the desired expected, actual ordering does seem to be used in the next for loop.\n\nI had to look at this for awhile - thinking this would never fail - until I realized that resp_headers !\u003d resp.headers\n\nWould you be ok with renaming resp_headers to expected_resp_hdrs or something like that?","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        # Turns out, fake_http_connect is rather liberal in what it sends back"},{"line_number":646,"context_line":"        for header, expected_value in resp_headers.items():"},{"line_number":647,"context_line":"            self.assertIn(header, resp.headers)"},{"line_number":648,"context_line":"            self.assertEqual(resp.headers[header], expected_value)"},{"line_number":649,"context_line":"        for connection_id, info in put_requests.items():"},{"line_number":650,"context_line":"            body \u003d \u0027\u0027.join(info[\u0027chunks\u0027])"},{"line_number":651,"context_line":"            headers \u003d info[\u0027headers\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_621d2b0f","line":648,"in_reply_to":"1ac06dbe_27c5f73b","updated":"2016-08-26 00:47:11.000000000","message":"Done. obj_server_headers sound good?","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        resp_headers \u003d {"},{"line_number":707,"context_line":"            \u0027Etag\u0027: \u0027\"resp_etag\"\u0027,"},{"line_number":708,"context_line":"            # NB: ignored!"},{"line_number":709,"context_line":"            \u0027X-Object-Sysmeta-1\u0027: \u0027One\u0027,"},{"line_number":710,"context_line":"            \u0027X-Object-Meta-2\u0027: \u0027Two\u0027,"},{"line_number":711,"context_line":"            \u0027X-Object-Transient-Sysmeta-3\u0027: \u0027Three\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_a7fe0769","line":708,"updated":"2016-08-21 00:06:25.000000000","message":"I know this was already there, but maybe this comment can be improved or removed?  I noticed that the Etag \u003d ignored later.  Maybe that is what this comment is about.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":705,"context_line":""},{"line_number":706,"context_line":"        resp_headers \u003d {"},{"line_number":707,"context_line":"            \u0027Etag\u0027: \u0027\"resp_etag\"\u0027,"},{"line_number":708,"context_line":"            # NB: ignored!"},{"line_number":709,"context_line":"            \u0027X-Object-Sysmeta-1\u0027: \u0027One\u0027,"},{"line_number":710,"context_line":"            \u0027X-Object-Meta-2\u0027: \u0027Two\u0027,"},{"line_number":711,"context_line":"            \u0027X-Object-Transient-Sysmeta-3\u0027: \u0027Three\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_42e74712","line":708,"in_reply_to":"1ac06dbe_a7fe0769","updated":"2016-08-26 00:47:11.000000000","message":"Done. It was in reference to the Some-Header, which is no longer ignored. Somewhere in my messy history of rebases I forgot to remove this.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"            \u0027X-Object-Meta-2\u0027: \u0027Two\u0027,"},{"line_number":1927,"context_line":"            \u0027X-Object-Transient-Sysmeta-3\u0027: \u0027Three\u0027,"},{"line_number":1928,"context_line":"            \u0027Some-Other-Header\u0027: \u0027Four\u0027,"},{"line_number":1929,"context_line":"            \u0027Etag\u0027: \u0027ignored\u0027,"},{"line_number":1930,"context_line":"        }"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"        put_requests \u003d defaultdict(lambda: {\u0027boundary\u0027: None, \u0027chunks\u0027: []})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_6ef98780","line":1929,"updated":"2016-08-21 00:06:25.000000000","message":"Why is this set to \u0027ignored\u0027 when it will actually be \u00276ae475feec714ee7adfc1ca05e66b617\u0027?  I see that the value is popped at 1955 and 1956 because the assert in the following loop would fail since ignored doesn\u0027t match.\n\nI tried changing this to have the actual etag and I removed lines 1955 and 1956, and the test passes.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":1926,"context_line":"            \u0027X-Object-Meta-2\u0027: \u0027Two\u0027,"},{"line_number":1927,"context_line":"            \u0027X-Object-Transient-Sysmeta-3\u0027: \u0027Three\u0027,"},{"line_number":1928,"context_line":"            \u0027Some-Other-Header\u0027: \u0027Four\u0027,"},{"line_number":1929,"context_line":"            \u0027Etag\u0027: \u0027ignored\u0027,"},{"line_number":1930,"context_line":"        }"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"        put_requests \u003d defaultdict(lambda: {\u0027boundary\u0027: None, \u0027chunks\u0027: []})"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_2f34d748","line":1929,"in_reply_to":"1ac06dbe_6ef98780","updated":"2016-08-26 00:47:11.000000000","message":"Because it *is* ignored :-P The EC putter ignores the etags returned by the object servers and instead responds with the MD5 that it calculated as it was feeding input through pyeclib.\n\nThe test at L1955 demonstrates that, but hopefully that will be more apparent when we don\u0027t have the resp.headers / resp_headers confusion.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":1954,"context_line":"        self.assertIn(\u0027Etag\u0027, resp.headers)"},{"line_number":1955,"context_line":"        self.assertEqual(resp.headers.pop(\u0027Etag\u0027), etag)"},{"line_number":1956,"context_line":"        resp_headers.pop(\u0027Etag\u0027)"},{"line_number":1957,"context_line":"        # Turns out, fake_http_connect is rather liberal in what it sends back"},{"line_number":1958,"context_line":"        for header, expected_value in resp_headers.items():"},{"line_number":1959,"context_line":"            self.assertIn(header, resp.headers)"},{"line_number":1960,"context_line":"            self.assertEqual(resp.headers[header], expected_value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_0e39f341","line":1957,"updated":"2016-08-21 00:06:25.000000000","message":"For my learning, can you explain more about this comment (I see this in all the spots with this for loop)?  I don\u0027t see the connection to the code block here.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":1954,"context_line":"        self.assertIn(\u0027Etag\u0027, resp.headers)"},{"line_number":1955,"context_line":"        self.assertEqual(resp.headers.pop(\u0027Etag\u0027), etag)"},{"line_number":1956,"context_line":"        resp_headers.pop(\u0027Etag\u0027)"},{"line_number":1957,"context_line":"        # Turns out, fake_http_connect is rather liberal in what it sends back"},{"line_number":1958,"context_line":"        for header, expected_value in resp_headers.items():"},{"line_number":1959,"context_line":"            self.assertIn(header, resp.headers)"},{"line_number":1960,"context_line":"            self.assertEqual(resp.headers[header], expected_value)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_02e7ffe4","line":1957,"in_reply_to":"1ac06dbe_0e39f341","updated":"2016-08-26 00:47:11.000000000","message":"I was originally hoping to follow the pattern of the previous patchset and just have something like\n\n self.assertEqual(dict(resp.headers), resp_headers)\n\nHowever, fake_http_connect sends back a *ton* of not-representative stuff, all the time. So resp.headers looks something like\n\n {\u0027Content-Length\u0027: \u00270\u0027,\n  \u0027Content-Type\u0027: \u0027x-application/test\u0027,\n  \u0027Last-Modified\u0027: \u0027Fri, 26 Aug 2016 00:16:51 GMT\u0027,\n  \u0027Some-Other-Header\u0027: \u0027Four\u0027,\n  \u0027X-Account-Container-Count\u0027: \u002712345\u0027,\n  \u0027X-Backend-Timestamp\u0027: \u00271\u0027,\n  \u0027X-Delete-At\u0027: \u00279876543210\u0027,\n  \u0027X-Object-Meta-2\u0027: \u0027Two\u0027,\n  \u0027X-Object-Meta-Test\u0027: \u0027testing\u0027,\n  \u0027X-Object-Sysmeta-1\u0027: \u0027One\u0027,\n  \u0027X-Object-Transient-Sysmeta-3\u0027: \u0027Three\u0027,\n  \u0027X-Timestamp\u0027: \u00271\u0027,\n  \u0027X-Works\u0027: \u0027yes\u0027}\n\nI decided that fixing everything that actually *did* expect some of those headers wasn\u0027t worth the time (at least, right now).","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"2611742a237efff88a47d2228f4ef6defc99d1aa","unresolved":false,"context_lines":[{"line_number":2090,"context_line":"                if header \u003d\u003d \u0027Etag\u0027:"},{"line_number":2091,"context_line":"                    continue"},{"line_number":2092,"context_line":"                self.assertIn(header, resp.headers)"},{"line_number":2093,"context_line":"                self.assertEqual(resp.headers[header], expected_value)"},{"line_number":2094,"context_line":"            for connection_id, info in put_requests.items():"},{"line_number":2095,"context_line":"                body \u003d unchunk_body(\u0027\u0027.join(info[\u0027chunks\u0027]))"},{"line_number":2096,"context_line":"                # email.parser.FeedParser doesn\u0027t know how to take a multipart"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ac06dbe_ae21bffd","line":2093,"updated":"2016-08-21 00:06:25.000000000","message":"Is there a reason why the \u0027Last-Modified\u0027 and \u0027Content-Type\u0027 no longer need to be asserted here?  I noticed that the \u0027Content-Type\u0027 did change to now be \u0027x-application/test\u0027.  Maybe it is only the test that is setting those items now?","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6382f69ae108acc23f415f4ca9308f50d6fba338","unresolved":false,"context_lines":[{"line_number":2090,"context_line":"                if header \u003d\u003d \u0027Etag\u0027:"},{"line_number":2091,"context_line":"                    continue"},{"line_number":2092,"context_line":"                self.assertIn(header, resp.headers)"},{"line_number":2093,"context_line":"                self.assertEqual(resp.headers[header], expected_value)"},{"line_number":2094,"context_line":"            for connection_id, info in put_requests.items():"},{"line_number":2095,"context_line":"                body \u003d unchunk_body(\u0027\u0027.join(info[\u0027chunks\u0027]))"},{"line_number":2096,"context_line":"                # email.parser.FeedParser doesn\u0027t know how to take a multipart"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa7ab95a_228883e7","line":2093,"in_reply_to":"1ac06dbe_ae21bffd","updated":"2016-08-26 00:47:11.000000000","message":"See above; while the previously-asserted Content-Type, Last-Modified, and Content-Length *were* representative of what an object-server would send back, I didn\u0027t see a good way to bend fake_http_connect to properly test it.","commit_id":"c23c68f551ba5fbaabe22d60238f19d32a7ef51d"}]}
