)]}'
{"swift/common/middleware/slo.py":[{"author":{"_account_id":18820,"name":"Peter Chng","email":"pchng@ca.ibm.com","username":"pchng"},"change_message_id":"bac769a4c63032a50c266ff3c864baf671bfc983","unresolved":false,"context_lines":[{"line_number":148,"context_line":"A GET request with the query parameter::"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    ?multipart-manifest\u003dget"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"A GET request with the query parameter that matches the data sent from the"},{"line_number":153,"context_line":"original multipart-manifest-put::"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_8e52e633","line":151,"updated":"2016-01-11 17:38:48.000000000","message":"I think it would be worthwhile to leave a note here that a query with `multipart-manifest\u003dget` returns the generated JSON (i.e. with the additional fields like {etag, size_bytes} filled out?) and will not match the JSON sent in the PUT. (i.e. the existing behaviour)\n\nThis will help contrast with the query with `multipart-manifest\u003dget-raw` that you outlined below.","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":583,"context_line":""},{"line_number":584,"context_line":"        # Handle pass-through request for the manifest itself"},{"line_number":585,"context_line":"        if (req.params.get(\u0027multipart-manifest\u0027) \u003d\u003d \u0027get\u0027 or"},{"line_number":586,"context_line":"                req.params.get(\u0027multipart-manifest\u0027) \u003d\u003d \u0027get-raw\u0027):"},{"line_number":587,"context_line":"            new_headers \u003d []"},{"line_number":588,"context_line":"            for header, value in self._response_headers:"},{"line_number":589,"context_line":"                if header.lower() \u003d\u003d \u0027content-type\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_e1c6139b","line":586,"updated":"2016-01-11 18:09:30.000000000","message":"Another way of saying it:\n\n    if req.params.get(\u0027multipart-manifest\u0027) in (\u0027get\u0027, \u0027get-raw\u0027):","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":627,"context_line":"        \"\"\""},{"line_number":628,"context_line":"        segments \u003d self._get_manifest_read(resp_iter)"},{"line_number":629,"context_line":"        if segments is []:"},{"line_number":630,"context_line":"            return resp_iter"},{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        for seg_dict in segments:"},{"line_number":633,"context_line":"            seg_dict.pop(\u0027content_type\u0027, None)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_2e197a88","line":630,"range":{"start_line":630,"start_character":19,"end_line":630,"end_character":28},"updated":"2016-01-11 18:09:30.000000000","message":"We\u0027ve already read all of resp_iter, right? So won\u0027t this send back an empty string, instead of \u0027[]\u0027?","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"54c27717206430ab621678a7ad1e617ef502640a","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    ?multipart-manifest\u003dget"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"The query above does not match the JSON format that is sent in a PUT request."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"A GET request with the query parameter that matches the data sent from the"},{"line_number":155,"context_line":"original multipart-manifest-put::"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_b5ae7e96","line":152,"range":{"start_line":152,"start_character":4,"end_line":152,"end_character":9},"updated":"2016-01-21 17:21:25.000000000","message":"The sentence seems kind of broken now, I\u0027m reading like this: \n\"A GET request with the query parameter: ?multipart-manifest\u003dget A GET request with the query parameter that matches...\"\n\nhow about:\n\n\"A GET request with the query parameter: ?multipart-manifest\u003dget will return a generated manifest that does not match the original multipart-manifest\u003dput. It contains additional fields and different key names.\"","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77ed1fb07e02497131d385fda7aa6130dcc1b6d4","unresolved":false,"context_lines":[{"line_number":630,"context_line":"        \"\"\""},{"line_number":631,"context_line":"        segments \u003d self._get_manifest_read(resp_iter)"},{"line_number":632,"context_line":"        if segments is []:"},{"line_number":633,"context_line":"            return \u0027\u0027"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"        for seg_dict in segments:"},{"line_number":636,"context_line":"            seg_dict.pop(\u0027content_type\u0027, None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_f33f9784","line":633,"range":{"start_line":633,"start_character":19,"end_line":633,"end_character":21},"updated":"2016-01-25 20:29:46.000000000","message":"My point earlier was more that we\u0027ll be sending something that isn\u0027t JSON. Although, come to think of it, \u0027segments is []\u0027 will always be False anyway, as it creates a new list during the evaluation so the two will never reference the same memory.\n\nMaybe we should just drop the early exit entirely? If there aren\u0027t any segments, everything still works and makes sense.","commit_id":"ad201f78ea5f3df306aa0d3c54581f78321c772a"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"381069afea16ef3d35266e13bcf798fafe6113ed","unresolved":false,"context_lines":[{"line_number":151,"context_line":""},{"line_number":152,"context_line":"The query above does not match the JSON format that is sent in a PUT request."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"A GET request with the query parameter: ?multipart-manifest\u003dget will only"},{"line_number":155,"context_line":"return a generated manifest that does not match the original"},{"line_number":156,"context_line":"multipart-manifest\u003dput. It also contains additional fields and different key"},{"line_number":157,"context_line":"names::"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a5ae5dd_e0bae0bf","line":154,"range":{"start_line":154,"start_character":13,"end_line":154,"end_character":14},"updated":"2016-02-04 15:00:37.000000000","message":"sorry, I think I might have confused you with my previous comment. Now the beginning of line 154 duplicates line 148-150. It is easier to see it here: http://docs-draft.openstack.org/02/263902/6/check/gate-swift-docs/cf3302f//doc/build/html/overview_large_objects.html#slo-doc","commit_id":"5d3f42b41c4c2917cd2c1274e6f36e66cf42629b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    ?multipart-manifest\u003dget"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"will return a generated manifest that does not match the original"},{"line_number":153,"context_line":"multipart-manifest\u003dput.  It also contains additional fields and"},{"line_number":154,"context_line":"different key names."},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_a00e5c32","line":152,"updated":"2016-02-10 17:34:59.000000000","message":"\"does not match\" sounds scarier than it is, like its an error - it is a transformed version of the original","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    ?multipart-manifest\u003dget"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"will return a generated manifest that does not match the original"},{"line_number":153,"context_line":"multipart-manifest\u003dput.  It also contains additional fields and"},{"line_number":154,"context_line":"different key names."},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_d25f603f","line":152,"in_reply_to":"3a57f1b5_a00e5c32","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    ?multipart-manifest\u003dget-raw"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"will return the actual manifest file itself.  The main purpose for both"},{"line_number":161,"context_line":"calls is solely debugging."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"When the manifest object is uploaded you are more or less guaranteed that"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_e0bf74ce","line":160,"updated":"2016-02-10 17:34:59.000000000","message":"get-raw does *not* return the actual file content, correct? get-raw transforms the file content back to the client-side format","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    ?multipart-manifest\u003dget-raw"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"will return the actual manifest file itself.  The main purpose for both"},{"line_number":161,"context_line":"calls is solely debugging."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"When the manifest object is uploaded you are more or less guaranteed that"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_b25a9c4e","line":160,"in_reply_to":"3a57f1b5_e0bf74ce","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        for seg_dict in segments:"},{"line_number":633,"context_line":"            seg_dict.pop(\u0027content_type\u0027, None)"},{"line_number":634,"context_line":"            seg_dict.pop(\u0027last_modified\u0027, None)"},{"line_number":635,"context_line":"            seg_dict[\u0027path\u0027] \u003d seg_dict.pop(\u0027name\u0027, None)"},{"line_number":636,"context_line":"            seg_dict[\u0027size_bytes\u0027] \u003d seg_dict.pop(\u0027bytes\u0027, None)"},{"line_number":637,"context_line":"            seg_dict[\u0027etag\u0027] \u003d seg_dict.pop(\u0027hash\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_8cb02f45","line":634,"updated":"2016-02-10 17:34:59.000000000","message":"sub_slo is missing","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":631,"context_line":""},{"line_number":632,"context_line":"        for seg_dict in segments:"},{"line_number":633,"context_line":"            seg_dict.pop(\u0027content_type\u0027, None)"},{"line_number":634,"context_line":"            seg_dict.pop(\u0027last_modified\u0027, None)"},{"line_number":635,"context_line":"            seg_dict[\u0027path\u0027] \u003d seg_dict.pop(\u0027name\u0027, None)"},{"line_number":636,"context_line":"            seg_dict[\u0027size_bytes\u0027] \u003d seg_dict.pop(\u0027bytes\u0027, None)"},{"line_number":637,"context_line":"            seg_dict[\u0027etag\u0027] \u003d seg_dict.pop(\u0027hash\u0027, None)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_5d1361b8","line":634,"in_reply_to":"3a57f1b5_8cb02f45","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9abebbff68f30347287ae01b879c9990b18ae4a2","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    ?multipart-manifest\u003dget\u0026format\u003draw"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"will return the contents of the original manifest as it was sent by the client."},{"line_number":160,"context_line":"The main purpose for both calls is solely debugging."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"When the manifest object is uploaded you are more or less guaranteed that"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_f0e99ce7","line":159,"range":{"start_line":159,"start_character":50,"end_line":159,"end_character":78},"updated":"2016-02-29 12:41:17.000000000","message":"This may be a little strong. Not sure that it would be problematic, but we can\u0027t make any guarantees about matching key order, or whitespace, or...","commit_id":"1c961bb8c50e7e6fab8d2c0476e9480384b22ef1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9abebbff68f30347287ae01b879c9990b18ae4a2","unresolved":false,"context_lines":[{"line_number":638,"context_line":"            json_data \u003d json_data.encode(\u0027utf-8\u0027)"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"        new_headers \u003d []"},{"line_number":641,"context_line":"        for header, value in resp_headers:"},{"line_number":642,"context_line":"            if header.lower() \u003d\u003d \u0027content-length\u0027:"},{"line_number":643,"context_line":"                new_headers.append((\u0027Content-Length\u0027,"},{"line_number":644,"context_line":"                                    len(json_data)))"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_bb97f538","line":641,"range":{"start_line":641,"start_character":29,"end_line":641,"end_character":41},"updated":"2016-02-29 12:41:17.000000000","message":"Would this ever *not* be self._response_headers? I wonder if it might be better to use that, and drop the resp_headers arg entirely.","commit_id":"1c961bb8c50e7e6fab8d2c0476e9480384b22ef1"}],"test/functional/tests.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":3032,"context_line":"        self.assertEqual(value[1][\u0027name\u0027],"},{"line_number":3033,"context_line":"                         \u0027/%s/seg_b\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3034,"context_line":""},{"line_number":3035,"context_line":"    def test_slo_get_raw_the_manifest(self):"},{"line_number":3036,"context_line":"        manifest \u003d self.env.container.file(\"manifest-abcde\")"},{"line_number":3037,"context_line":"        got_body \u003d manifest.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get-raw\u0027})"},{"line_number":3038,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_61a78350","line":3035,"updated":"2016-01-11 18:09:30.000000000","message":"What does this test add that the next one doesn\u0027t provide? Right now, it just checks that we get back valid JSON with an appropriate content-type; both of those assertions are also being made in the other test.\n\nI suppose this was mostly cribbed from test_slo_get_the_manifest, but I\u0027m not really a fan of that test, either.","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":3060,"context_line":"                         hashlib.md5(\u0027d\u0027 * 1024 * 1024).hexdigest())"},{"line_number":3061,"context_line":"        self.assertEqual(value[0][\u0027path\u0027],"},{"line_number":3062,"context_line":"                         \u0027/%s/seg_d\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3063,"context_line":""},{"line_number":3064,"context_line":"        self.assertEqual(value[1][\u0027size_bytes\u0027], 1024 * 1024)"},{"line_number":3065,"context_line":"        self.assertEqual(value[1][\u0027etag\u0027],"},{"line_number":3066,"context_line":"                         hashlib.md5(\u0027b\u0027 * 1024 * 1024).hexdigest())"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_44e36dd9","line":3063,"updated":"2016-01-11 18:09:30.000000000","message":"Should we maybe also assert that\n\n    set(value[0].keys()) \u003d\u003d set((\u0027size_bytes\u0027, \u0027etag\u0027, \u0027path\u0027))\n\n?","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":3066,"context_line":"                         hashlib.md5(\u0027b\u0027 * 1024 * 1024).hexdigest())"},{"line_number":3067,"context_line":"        self.assertEqual(value[1][\u0027path\u0027],"},{"line_number":3068,"context_line":"                         \u0027/%s/seg_b\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3069,"context_line":""},{"line_number":3070,"context_line":"    def test_slo_head_the_manifest(self):"},{"line_number":3071,"context_line":"        manifest \u003d self.env.container.file(\"manifest-abcde\")"},{"line_number":3072,"context_line":"        got_info \u003d manifest.info(parms\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_e1085382","line":3069,"updated":"2016-01-11 18:09:30.000000000","message":"As long as we\u0027re adding functional tests, what do you think about adding one to actually take the response from a get-raw request and feed it back into a PUT? That was one of the motivating use-cases for this change, right?","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"54c27717206430ab621678a7ad1e617ef502640a","unresolved":false,"context_lines":[{"line_number":3032,"context_line":"        self.assertEqual(value[1][\u0027name\u0027],"},{"line_number":3033,"context_line":"                         \u0027/%s/seg_b\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3034,"context_line":""},{"line_number":3035,"context_line":"    def test_slo_get_raw_the_manifest(self):"},{"line_number":3036,"context_line":"        manifest \u003d self.env.container.file(\"manifest-abcde\")"},{"line_number":3037,"context_line":"        got_body \u003d manifest.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get-raw\u0027})"},{"line_number":3038,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_7b6475e4","line":3035,"updated":"2016-01-21 17:21:25.000000000","message":"I think Tim might have pointed this out before, but it is not clear to me why this test is necessary. It seems like the following test (i.e., test_slo_get_raw_the_manifest_with_details_from_server) tests same conditionals","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"54c27717206430ab621678a7ad1e617ef502640a","unresolved":false,"context_lines":[{"line_number":3041,"context_line":"        try:"},{"line_number":3042,"context_line":"            json.loads(got_body)"},{"line_number":3043,"context_line":"        except ValueError:"},{"line_number":3044,"context_line":"            self.fail(\"GET with multipart-manifest\u003dget got invalid json\")"},{"line_number":3045,"context_line":""},{"line_number":3046,"context_line":"    def test_slo_get_raw_the_manifest_with_details_from_server(self):"},{"line_number":3047,"context_line":"        manifest \u003d self.env.container.file(\"manifest-db\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_fb02a508","line":3044,"range":{"start_line":3044,"start_character":51,"end_line":3044,"end_character":54},"updated":"2016-01-21 17:21:25.000000000","message":"get-raw","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"54c27717206430ab621678a7ad1e617ef502640a","unresolved":false,"context_lines":[{"line_number":3052,"context_line":"        try:"},{"line_number":3053,"context_line":"            value \u003d json.loads(got_body)"},{"line_number":3054,"context_line":"        except ValueError:"},{"line_number":3055,"context_line":"            self.fail(\"GET with multipart-manifest\u003dget got invalid json\")"},{"line_number":3056,"context_line":""},{"line_number":3057,"context_line":"        self.assertEqual("},{"line_number":3058,"context_line":"            set(value[0].keys()), set((\u0027size_bytes\u0027, \u0027etag\u0027, \u0027path\u0027)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_3b303de8","line":3055,"range":{"start_line":3055,"start_character":51,"end_line":3055,"end_character":54},"updated":"2016-01-21 17:21:25.000000000","message":"get-raw","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77ed1fb07e02497131d385fda7aa6130dcc1b6d4","unresolved":false,"context_lines":[{"line_number":3071,"context_line":"        file_item \u003d self.env.container.file(\"manifest-from-get-raw\")"},{"line_number":3072,"context_line":"        try:"},{"line_number":3073,"context_line":"            file_item.write(got_body, parms\u003d{\u0027multipart-manifest\u0027: \u0027put\u0027})"},{"line_number":3074,"context_line":"        except ResponseError as err:"},{"line_number":3075,"context_line":"            self.assertEqual(400, err.status)"},{"line_number":3076,"context_line":""},{"line_number":3077,"context_line":"        file_contents \u003d file_item.read()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_1384ab08","line":3074,"updated":"2016-01-25 20:29:46.000000000","message":"Wait, are we expecting this to fail? I was expecting this to succeed. The test seems to pass without the try/except.","commit_id":"ad201f78ea5f3df306aa0d3c54581f78321c772a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":3057,"context_line":"        self.assertEqual(value[1][\u0027path\u0027],"},{"line_number":3058,"context_line":"                         \u0027/%s/seg_b\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3059,"context_line":""},{"line_number":3060,"context_line":"    def test_slo_get_raw_the_manifest_into_put(self):"},{"line_number":3061,"context_line":"        manifest \u003d self.env.container.file(\"manifest-db\")"},{"line_number":3062,"context_line":"        got_body \u003d manifest.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get-raw\u0027})"},{"line_number":3063,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_b42bfaea","line":3060,"updated":"2016-02-10 17:34:59.000000000","message":"nit: this significant part of this test could be appended to the previous to avoid some upload time.\n \ni.e. delete lines 3060 to 3070","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":3057,"context_line":"        self.assertEqual(value[1][\u0027path\u0027],"},{"line_number":3058,"context_line":"                         \u0027/%s/seg_b\u0027 % self.env.container.name.decode(\"utf-8\"))"},{"line_number":3059,"context_line":""},{"line_number":3060,"context_line":"    def test_slo_get_raw_the_manifest_into_put(self):"},{"line_number":3061,"context_line":"        manifest \u003d self.env.container.file(\"manifest-db\")"},{"line_number":3062,"context_line":"        got_body \u003d manifest.read(parms\u003d{\u0027multipart-manifest\u0027: \u0027get-raw\u0027})"},{"line_number":3063,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_fd4515b3","line":3060,"in_reply_to":"3a57f1b5_b42bfaea","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9abebbff68f30347287ae01b879c9990b18ae4a2","unresolved":false,"context_lines":[{"line_number":3139,"context_line":"            value \u003d json.loads(got_body)"},{"line_number":3140,"context_line":"        except ValueError:"},{"line_number":3141,"context_line":"            msg \u003d \"GET with multipart-manifest\u003dget\u0026format\u003draw got invalid json\""},{"line_number":3142,"context_line":"            self.fail(msg)"},{"line_number":3143,"context_line":""},{"line_number":3144,"context_line":"        self.assertEqual("},{"line_number":3145,"context_line":"            set(value[0].keys()), set((\u0027size_bytes\u0027, \u0027etag\u0027, \u0027path\u0027)))"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_1beee1b3","line":3142,"range":{"start_line":3142,"start_character":22,"end_line":3142,"end_character":25},"updated":"2016-02-29 12:41:17.000000000","message":"Maybe also worth including the value of got_body?","commit_id":"1c961bb8c50e7e6fab8d2c0476e9480384b22ef1"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u00271-99\u0027},"},{"line_number":1125,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1126,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u0027100-200\u0027}])"},{"line_number":1127,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1128,"context_line":"        self.app.register("},{"line_number":1129,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc-r\u0027,"},{"line_number":1130,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json;swift_bytes\u003d25\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_240679ce","line":1127,"updated":"2016-01-11 18:09:30.000000000","message":"Mind moving the bc_etag assignment up a bit? As it is, it seems like it\u0027s associated with the manifest-bc-r stuff.","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e5004720ba4d3949ba2e2393c5d76fd66ba28e06","unresolved":false,"context_lines":[{"line_number":1133,"context_line":"                          \u0027Etag\u0027: md5hex(_bc_manifest_json_ranges)},"},{"line_number":1134,"context_line":"            _bc_manifest_json_ranges)"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"        _bc_ranges_manifest_json \u003d json.dumps("},{"line_number":1137,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10),"},{"line_number":1138,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1139,"context_line":"              \u0027range\u0027: \u00274-7\u0027},"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_04dfb53a","line":1136,"updated":"2016-01-11 18:09:30.000000000","message":"Do we ever use this last manifest?","commit_id":"e0c68c7f9882b47f5fae3f11dc75cca1bdd6ad77"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"54c27717206430ab621678a7ad1e617ef502640a","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1144,"context_line":"        self.assertTrue((\u0027Content-Length\u0027, 182) in headers, headers)"},{"line_number":1145,"context_line":"        self.assertTrue((\u0027Etag\u0027, self.bc_etag) in headers, headers)"},{"line_number":1146,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":1147,"context_line":"        self.assertTrue("},{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_fb3aa597","line":1145,"updated":"2016-01-21 17:21:25.000000000","message":"shouldn\u0027t the etag here be different in the case of get-raw?","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"09961ff29f58d0fd8037cd510d95cae564390846","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1144,"context_line":"        self.assertTrue((\u0027Content-Length\u0027, 182) in headers, headers)"},{"line_number":1145,"context_line":"        self.assertTrue((\u0027Etag\u0027, self.bc_etag) in headers, headers)"},{"line_number":1146,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":1147,"context_line":"        self.assertTrue("},{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_8b507b33","line":1145,"in_reply_to":"9a68dd71_3fe21630","updated":"2016-01-25 12:21:49.000000000","message":"Janie, that\u0027s correct for the slo object itself, but in this case, it is returning the etag of the manifest. But this is an interesting problem, because the etag of the stored object (i.e., manifest) is correct, but we are modifying the content of the object, so I think the etag should be updated.","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"dd4295957cf51df2f35cd4690f0faf5e8e1d6c55","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1144,"context_line":"        self.assertTrue((\u0027Content-Length\u0027, 182) in headers, headers)"},{"line_number":1145,"context_line":"        self.assertTrue((\u0027Etag\u0027, self.bc_etag) in headers, headers)"},{"line_number":1146,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":1147,"context_line":"        self.assertTrue("},{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a68dd71_3fe21630","line":1145,"in_reply_to":"9a68dd71_fb3aa597","updated":"2016-01-23 04:13:15.000000000","message":"My understanding is that the response etag for slo is the etag of etags, so it would not be affected by a change in manifest format.  Of course, I could be wrong!","commit_id":"abd76418b0e618601fb7b992d25aeafebc2214f7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77ed1fb07e02497131d385fda7aa6130dcc1b6d4","unresolved":false,"context_lines":[{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1144,"context_line":"        self.assertTrue((\u0027Content-Length\u0027, 182) in headers, headers)"},{"line_number":1145,"context_line":"        self.assertTrue((\u0027Etag\u0027, self.bc_etag) in headers, headers)"},{"line_number":1146,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":1147,"context_line":"        self.assertTrue("},{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a68dd71_0ecc82b9","line":1145,"updated":"2016-01-25 20:29:46.000000000","message":"I\u0027m torn here. My gut instinct is to agree with Thiago; since the raw manifest and the manifest stored in swift have different content, they should probably have different etags.\n\nBut then I think back to the RFC:\n\n\u003e An entity-tag is an opaque validator for differentiating between multiple representations of the same resource...\n\nSince /v1/a/c/o and /v1/a/c/o?multipart-manifest\u003dget are separate resources (while related, their URIs are different), using the same etag for both shouldn\u0027t really matter.","commit_id":"ad201f78ea5f3df306aa0d3c54581f78321c772a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1111,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027},"},{"line_number":1112,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1113,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1114,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1115,"context_line":"        self.app.register("},{"line_number":1116,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_04c2dd33","line":1113,"updated":"2016-02-10 17:34:59.000000000","message":"these dicts should have a last_modified entry","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1111,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027},"},{"line_number":1112,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1113,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1114,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1115,"context_line":"        self.app.register("},{"line_number":1116,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_2cbe2cd4","line":1113,"in_reply_to":"3a57f1b5_04c2dd33","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"0c65a61ad976484052266ac6351de8513f3a6335","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1111,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027},"},{"line_number":1112,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1113,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1114,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1115,"context_line":"        self.app.register("},{"line_number":1116,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_26b53d30","line":1113,"in_reply_to":"3a57f1b5_04c2dd33","updated":"2016-02-12 04:15:20.000000000","message":"do they also need a \"sub_slo\"?  I don\u0027t really know about  this key/value pair, but you had mentioned that it needed to be popped in slo along with last_modified.  It seems that there were no existing unit tests revealing that omission.","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":1110,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1111,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027},"},{"line_number":1112,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1113,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027}])"},{"line_number":1114,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":1115,"context_line":"        self.app.register("},{"line_number":1116,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_6cb834e6","line":1113,"in_reply_to":"3a57f1b5_26b53d30","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1125,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u00271-99\u0027},"},{"line_number":1126,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1127,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u0027100-200\u0027}])"},{"line_number":1128,"context_line":"        self.app.register("},{"line_number":1129,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc-r\u0027,"},{"line_number":1130,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json;swift_bytes\u003d25\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_84ec8dc8","line":1127,"updated":"2016-02-10 17:34:59.000000000","message":"ditto","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"            [{\u0027name\u0027: \u0027/gettest/b_10\u0027, \u0027hash\u0027: md5hex(\u0027b\u0027 * 10), \u0027bytes\u0027: \u002710\u0027,"},{"line_number":1125,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u00271-99\u0027},"},{"line_number":1126,"context_line":"             {\u0027name\u0027: \u0027/gettest/c_15\u0027, \u0027hash\u0027: md5hex(\u0027c\u0027 * 15), \u0027bytes\u0027: \u002715\u0027,"},{"line_number":1127,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027range\u0027: \u0027100-200\u0027}])"},{"line_number":1128,"context_line":"        self.app.register("},{"line_number":1129,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc-r\u0027,"},{"line_number":1130,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json;swift_bytes\u003d25\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_cccfc07d","line":1127,"in_reply_to":"3a57f1b5_84ec8dc8","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f6a2ff6971a68eada78b25ab5c61028241dc9fe1","unresolved":false,"context_lines":[{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"},{"line_number":1149,"context_line":"            headers)"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":"    def test_get_raw_manifest_passthrough(self):"},{"line_number":1152,"context_line":"        req \u003d Request.blank("},{"line_number":1153,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc?multipart-manifest\u003dget-raw\u0027,"},{"line_number":1154,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a57f1b5_0f7f5bab","line":1151,"updated":"2016-02-10 17:34:59.000000000","message":"why is this separate from previous test? - lines 1151 to 1161 could be deleted","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"3ecb1f2b939270001b841fa8251ad13e63df5b9c","unresolved":false,"context_lines":[{"line_number":1148,"context_line":"            (\u0027Content-Type\u0027, \u0027application/json; charset\u003dutf-8\u0027) in headers,"},{"line_number":1149,"context_line":"            headers)"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":"    def test_get_raw_manifest_passthrough(self):"},{"line_number":1152,"context_line":"        req \u003d Request.blank("},{"line_number":1153,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc?multipart-manifest\u003dget-raw\u0027,"},{"line_number":1154,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"dae33548_dc9625ef","line":1151,"in_reply_to":"3a57f1b5_0f7f5bab","updated":"2016-02-17 15:36:06.000000000","message":"Done","commit_id":"a7c6384cae642d26baff9200b30399fb87e3397b"}]}
