)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b1767f7401c40bc01804ee0f0b9b10079f26d5b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"dfbec78f_252e92a5","line":19,"updated":"2019-05-04 20:27:21.000000000","message":"We might should add a\n\n Partial-Bug: 1557260","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"549ee67d9fca6549ce59efa072362a36bae1decb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"dfbec78f_28c98777","line":19,"in_reply_to":"dfbec78f_252e92a5","updated":"2019-05-04 21:56:34.000000000","message":"Done","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"}],"doc/requirements.txt":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cab5be83e115e2d4c771808abfa6bc875b980a4c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# of appearance. Changing the order has an impact on the overall integration"},{"line_number":3,"context_line":"# process, which may cause wedges in the gate later."},{"line_number":4,"context_line":"# this is required for the docs build jobs"},{"line_number":5,"context_line":"sphinx\u003e\u003d1.6.2,\u003c2.0.0;python_version\u003d\u00272.7\u0027 # BSD"},{"line_number":6,"context_line":"sphinx\u003e\u003d1.6.2;python_version\u003e\u003d\u00273.4\u0027 # BSD"},{"line_number":7,"context_line":"openstackdocstheme\u003e\u003d1.11.0 # Apache-2.0"},{"line_number":8,"context_line":"reno\u003e\u003d1.8.0  # Apache-2.0"}],"source_content_type":"text/plain","patch_set":4,"id":"bfb3d3c7_10e28130","line":5,"range":{"start_line":5,"start_character":35,"end_line":5,"end_character":36},"updated":"2019-05-21 21:53:23.000000000","message":"Sorry, looks like I messed this up. should be a\n\n \u003d\u003d","commit_id":"34232945b1d8c6050be9a9c2068f3d6fe69888d1"}],"lower-constraints.txt":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cab5be83e115e2d4c771808abfa6bc875b980a4c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"bandit\u003d\u003d1.1.0"},{"line_number":5,"context_line":"boto\u003d\u003d2.32.1"},{"line_number":6,"context_line":"boto3\u003d\u003d1.9"},{"line_number":7,"context_line":"botocore\u003d\u003d1.12"},{"line_number":8,"context_line":"castellan\u003d\u003d0.13.0"},{"line_number":9,"context_line":"certifi\u003d\u003d2018.1.18"},{"line_number":10,"context_line":"cffi\u003d\u003d1.11.5"}],"source_content_type":"text/plain","patch_set":4,"id":"bfb3d3c7_0d558e1d","line":7,"updated":"2019-05-21 21:53:23.000000000","message":"boto3 drags in\n\n- s3transfer\n- jmespath\n- python-dateutil\n\ntoo, right? Should those be in here, too?","commit_id":"34232945b1d8c6050be9a9c2068f3d6fe69888d1"}],"test-requirements.txt":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b1767f7401c40bc01804ee0f0b9b10079f26d5b","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reno\u003e\u003d1.8.0  # Apache-2.0"},{"line_number":16,"context_line":"python-openstackclient\u003e\u003d3.12.0"},{"line_number":17,"context_line":"boto\u003e\u003d2.32.1"},{"line_number":18,"context_line":"boto3\u003e\u003d1.9"},{"line_number":19,"context_line":"requests-mock\u003e\u003d1.2.0 # Apache-2.0"},{"line_number":20,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":21,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"dfbec78f_650d6a3d","line":18,"updated":"2019-05-04 20:27:21.000000000","message":"Looks like we need a change to openstack/requirements, too. Apparently they\u0027ve got boto and botocore, but no boto3?? https://github.com/openstack/requirements/blob/master/global-requirements.txt#L15-L16\n\nI wonder who\u0027s using botocore without boto3...\n\nAlso, since we have imports straight from botocore, I think I\u0027d prefer to include a line for that as well (though I have a hard time imagining them ever releasing a boto3 that didn\u0027t drag in botocore...)","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"549ee67d9fca6549ce59efa072362a36bae1decb","unresolved":false,"context_lines":[{"line_number":15,"context_line":"reno\u003e\u003d1.8.0  # Apache-2.0"},{"line_number":16,"context_line":"python-openstackclient\u003e\u003d3.12.0"},{"line_number":17,"context_line":"boto\u003e\u003d2.32.1"},{"line_number":18,"context_line":"boto3\u003e\u003d1.9"},{"line_number":19,"context_line":"requests-mock\u003e\u003d1.2.0 # Apache-2.0"},{"line_number":20,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":21,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":1,"id":"dfbec78f_68b1bf8f","line":18,"in_reply_to":"dfbec78f_650d6a3d","updated":"2019-05-04 21:56:34.000000000","message":"Done","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":16,"context_line":"python-openstackclient\u003e\u003d3.12.0"},{"line_number":17,"context_line":"boto\u003e\u003d2.32.1"},{"line_number":18,"context_line":"boto3\u003e\u003d1.9"},{"line_number":19,"context_line":"botocore\u003e\u003d1.12"},{"line_number":20,"context_line":"requests-mock\u003e\u003d1.2.0 # Apache-2.0"},{"line_number":21,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":22,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"bfb3d3c7_777a1a89","line":19,"updated":"2019-05-16 23:25:21.000000000","message":"These should get added to our lower-constraints file, even though they\u0027re not used for unit tests.\n\nOff-topic: we should probably have a lower-constraints-enabled in-process func test...","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":16,"context_line":"python-openstackclient\u003e\u003d3.12.0"},{"line_number":17,"context_line":"boto\u003e\u003d2.32.1"},{"line_number":18,"context_line":"boto3\u003e\u003d1.9"},{"line_number":19,"context_line":"botocore\u003e\u003d1.12"},{"line_number":20,"context_line":"requests-mock\u003e\u003d1.2.0 # Apache-2.0"},{"line_number":21,"context_line":"fixtures\u003e\u003d3.0.0 # Apache-2.0/BSD"},{"line_number":22,"context_line":"keystonemiddleware\u003e\u003d4.17.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":2,"id":"bfb3d3c7_0a2d8942","line":19,"in_reply_to":"bfb3d3c7_777a1a89","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"}],"test/functional/s3api/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b1767f7401c40bc01804ee0f0b9b10079f26d5b","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class S3ApiBase(unittest2.TestCase):"},{"line_number":32,"context_line":"    def __init__(self, method_name):"},{"line_number":33,"context_line":"        super(S3ApiBase, self).__init__(method_name)"},{"line_number":34,"context_line":"        self.method_name \u003d method_name"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def setUp(self):"},{"line_number":37,"context_line":"        if \u0027s3api\u0027 not in tf.cluster_info:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_880f532d","line":34,"range":{"start_line":32,"start_character":4,"end_line":34,"end_character":38},"updated":"2019-05-04 20:27:21.000000000","message":"Off-topic: I have *no idea* what this is supposed to be doing...","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"}],"test/functional/s3api/s3_test_client.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0b1767f7401c40bc01804ee0f0b9b10079f26d5b","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    return boto3.client("},{"line_number":145,"context_line":"        \u0027s3\u0027, aws_access_key_id\u003daws_access_key,"},{"line_number":146,"context_line":"        aws_secret_access_key\u003daws_secret_key,"},{"line_number":147,"context_line":"        config\u003dconfig, region_name\u003d\u0027us-east-1\u0027, use_ssl\u003dFalse,"},{"line_number":148,"context_line":"        endpoint_url\u003d\u0027http://{}:{}\u0027.format(host, port))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfbec78f_a86fb7c3","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":61},"updated":"2019-05-04 20:27:21.000000000","message":"Off-topic: This preserves existing limitations, but at some point we should probably have this respect auth_ssl.","commit_id":"1349ae8130b99c39ba75dc759d9edce469b0ee3c"}],"test/functional/s3api/test_bucket.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        # PUT Bucket"},{"line_number":51,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027PUT\u0027, bucket)"},{"line_number":52,"context_line":"        self.assertEqual(status, 200)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":55,"context_line":"        self.assertIn(headers[\u0027location\u0027], ("}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_3c9d6959","side":"PARENT","line":52,"updated":"2019-05-16 23:25:21.000000000","message":"Maybe should make sure we\u0027re responding with 200 and not 201 or something.\n\n self.assertEqual(200, resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027])\n\nI think?","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            #   - https://github.com/boto/boto/issues/3716"},{"line_number":66,"context_line":"            # with proposed fixes at"},{"line_number":67,"context_line":"            #   - https://github.com/boto/boto/pull/3513"},{"line_number":68,"context_line":"            #   - https://github.com/boto/boto/pull/3676"},{"line_number":69,"context_line":"            \u0027http://%s%s:%d/%s\u0027 % ("},{"line_number":70,"context_line":"                self.conn.host,"},{"line_number":71,"context_line":"                \u0027\u0027 if self.conn.port \u003d\u003d 80 else \u0027:%d\u0027 % self.conn.port,"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_9cc49542","side":"PARENT","line":68,"updated":"2019-05-16 23:25:21.000000000","message":"Yeah, I really *really* hope we don\u0027t still need to worry about these...","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # GET Bucket(Without Object)"},{"line_number":78,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027GET\u0027, bucket)"},{"line_number":79,"context_line":"        self.assertEqual(status, 200)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":82,"context_line":"        self.assertIsNotNone(headers[\u0027content-type\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_dcf8cd7d","side":"PARENT","line":79,"updated":"2019-05-16 23:25:21.000000000","message":"Again, might be good to confirm the status code. Swift would\u0027ve 204ed for a text/plain listing...","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        # GET Bucket(Without Object)"},{"line_number":78,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027GET\u0027, bucket)"},{"line_number":79,"context_line":"        self.assertEqual(status, 200)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":82,"context_line":"        self.assertIsNotNone(headers[\u0027content-type\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_0a610937","side":"PARENT","line":79,"in_reply_to":"bfb3d3c7_dcf8cd7d","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":82,"context_line":"        self.assertIsNotNone(headers[\u0027content-type\u0027])"},{"line_number":83,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], str(len(body)))"},{"line_number":84,"context_line":"        # TODO; requires consideration"},{"line_number":85,"context_line":"        # self.assertEqual(headers[\u0027transfer-encoding\u0027], \u0027chunked\u0027)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":88,"context_line":"        self.assertEqual(elem.find(\u0027Name\u0027).text, bucket)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_3c04897b","side":"PARENT","line":85,"range":{"start_line":83,"start_character":8,"end_line":85,"end_character":67},"updated":"2019-05-16 23:25:21.000000000","message":"I wonder which way we go -- chunk-encoded, or just trust the content length?\n\nAssuming content-length, would boto3 raise an exception on a short read? having the server try to respond with *too many* bytes probably wouldn\u0027t get caught easily... It\u0027d mess with the request/response framing and the next request would go off the rails.","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        for obj in req_objects:"},{"line_number":100,"context_line":"            self.conn.make_request(\u0027PUT\u0027, bucket, obj)"},{"line_number":101,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027GET\u0027, bucket)"},{"line_number":102,"context_line":"        self.assertEqual(status, 200)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":105,"context_line":"        self.assertEqual(elem.find(\u0027Name\u0027).text, bucket)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_1c0d0590","side":"PARENT","line":102,"updated":"2019-05-16 23:25:21.000000000","message":"Again, the status code...","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        for obj in req_objects:"},{"line_number":100,"context_line":"            self.conn.make_request(\u0027PUT\u0027, bucket, obj)"},{"line_number":101,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027GET\u0027, bucket)"},{"line_number":102,"context_line":"        self.assertEqual(status, 200)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":105,"context_line":"        self.assertEqual(elem.find(\u0027Name\u0027).text, bucket)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_4a67014f","side":"PARENT","line":102,"in_reply_to":"bfb3d3c7_1c0d0590","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertIsNotNone(o.find(\u0027LastModified\u0027).text)"},{"line_number":116,"context_line":"            self.assertRegexpMatches("},{"line_number":117,"context_line":"                o.find(\u0027LastModified\u0027).text,"},{"line_number":118,"context_line":"                r\u0027^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$\u0027)"},{"line_number":119,"context_line":"            self.assertIsNotNone(o.find(\u0027ETag\u0027).text)"},{"line_number":120,"context_line":"            self.assertIsNotNone(o.find(\u0027Size\u0027).text)"},{"line_number":121,"context_line":"            self.assertIsNotNone(o.find(\u0027StorageClass\u0027).text)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_fc235104","side":"PARENT","line":118,"updated":"2019-05-16 23:25:21.000000000","message":"How does boto3 handle malformed timestamps?","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            self.assertIsNotNone(o.find(\u0027LastModified\u0027).text)"},{"line_number":116,"context_line":"            self.assertRegexpMatches("},{"line_number":117,"context_line":"                o.find(\u0027LastModified\u0027).text,"},{"line_number":118,"context_line":"                r\u0027^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$\u0027)"},{"line_number":119,"context_line":"            self.assertIsNotNone(o.find(\u0027ETag\u0027).text)"},{"line_number":120,"context_line":"            self.assertIsNotNone(o.find(\u0027Size\u0027).text)"},{"line_number":121,"context_line":"            self.assertIsNotNone(o.find(\u0027StorageClass\u0027).text)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_2a62cd3f","side":"PARENT","line":118,"in_reply_to":"bfb3d3c7_fc235104","updated":"2019-05-20 23:08:03.000000000","message":"Raises a ValueError.","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        for obj in req_objects:"},{"line_number":138,"context_line":"            self.conn.make_request(\u0027DELETE\u0027, bucket, obj)"},{"line_number":139,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027DELETE\u0027, bucket)"},{"line_number":140,"context_line":"        self.assertEqual(status, 204)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_dc020d3f","side":"PARENT","line":140,"updated":"2019-05-16 23:25:21.000000000","message":"...status...","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        for obj in req_objects:"},{"line_number":138,"context_line":"            self.conn.make_request(\u0027DELETE\u0027, bucket, obj)"},{"line_number":139,"context_line":"        status, headers, body \u003d self.conn.make_request(\u0027DELETE\u0027, bucket)"},{"line_number":140,"context_line":"        self.assertEqual(status, 204)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_6a4f65bd","side":"PARENT","line":140,"in_reply_to":"bfb3d3c7_dc020d3f","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            # Other users of the same account get the same 409 error"},{"line_number":169,"context_line":"            conn2 \u003d Connection(tf.config[\u0027s3_access_key2\u0027],"},{"line_number":170,"context_line":"                               tf.config[\u0027s3_secret_key2\u0027],"},{"line_number":171,"context_line":"                               tf.config[\u0027s3_access_key2\u0027])"},{"line_number":172,"context_line":"            status, headers, body \u003d conn2.make_request(\u0027PUT\u0027, \u0027bucket\u0027)"},{"line_number":173,"context_line":"            self.assertEqual(status, 409)"},{"line_number":174,"context_line":"            self.assertEqual(get_error_code(body), \u0027BucketAlreadyExists\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_9c7fb5aa","side":"PARENT","line":171,"range":{"start_line":171,"start_character":31,"end_line":171,"end_character":58},"updated":"2019-05-16 23:25:21.000000000","message":"I can\u0027t remember why Connections take a user_id that\u0027s separate from the aws_access_key_id but in practice always matches :-/","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            # Other users of the same account get the same 409 error"},{"line_number":169,"context_line":"            conn2 \u003d Connection(tf.config[\u0027s3_access_key2\u0027],"},{"line_number":170,"context_line":"                               tf.config[\u0027s3_secret_key2\u0027],"},{"line_number":171,"context_line":"                               tf.config[\u0027s3_access_key2\u0027])"},{"line_number":172,"context_line":"            status, headers, body \u003d conn2.make_request(\u0027PUT\u0027, \u0027bucket\u0027)"},{"line_number":173,"context_line":"            self.assertEqual(status, 409)"},{"line_number":174,"context_line":"            self.assertEqual(get_error_code(body), \u0027BucketAlreadyExists\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_4af5c156","side":"PARENT","line":171,"range":{"start_line":171,"start_character":31,"end_line":171,"end_character":58},"in_reply_to":"bfb3d3c7_9c7fb5aa","updated":"2019-05-20 23:08:03.000000000","message":"I think this is some flexibility that could be exercised in tests, but I didn\u0027t understand how it\u0027s currently used. It looked like we could use the matching user ID/AWS Access Key ID. The comment about it reads:\n\n\u003e :param user_id: a string consists of TENANT and USER name used for asserting Owner ID (not required S3Connection).\n\nWe could pull this parameter in if it turns out that this is actually exercised, but I didn\u0027t see it necessary for this first rewrite.","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        query \u003d \u0027encoding-type\u003d%s\u0027 % encoding_type"},{"line_number":259,"context_line":"        status, headers, body \u003d \\"},{"line_number":260,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":261,"context_line":"        self.assertEqual(status, 200)"},{"line_number":262,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":263,"context_line":"        self.assertEqual(elem.find(\u0027EncodingType\u0027).text, encoding_type)"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_97622ed8","side":"PARENT","line":261,"updated":"2019-05-16 23:25:21.000000000","message":"Lost the status check","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        query \u003d \u0027encoding-type\u003d%s\u0027 % encoding_type"},{"line_number":259,"context_line":"        status, headers, body \u003d \\"},{"line_number":260,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":261,"context_line":"        self.assertEqual(status, 200)"},{"line_number":262,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":263,"context_line":"        self.assertEqual(elem.find(\u0027EncodingType\u0027).text, encoding_type)"},{"line_number":264,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_eab7d585","side":"PARENT","line":261,"in_reply_to":"bfb3d3c7_97622ed8","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        expect_objects \u003d (\u0027object2\u0027, \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":274,"context_line":"        status, headers, body \u003d \\"},{"line_number":275,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":276,"context_line":"        self.assertEqual(status, 200)"},{"line_number":277,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":278,"context_line":"        self.assertEqual(elem.find(\u0027Marker\u0027).text, marker)"},{"line_number":279,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_579a76c5","side":"PARENT","line":276,"updated":"2019-05-16 23:25:21.000000000","message":"status","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        expect_objects \u003d (\u0027object2\u0027, \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":274,"context_line":"        status, headers, body \u003d \\"},{"line_number":275,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":276,"context_line":"        self.assertEqual(status, 200)"},{"line_number":277,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":278,"context_line":"        self.assertEqual(elem.find(\u0027Marker\u0027).text, marker)"},{"line_number":279,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_4ac381ee","side":"PARENT","line":276,"in_reply_to":"bfb3d3c7_579a76c5","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        expect_objects \u003d (\u0027dir/subdir/object\u0027, \u0027object\u0027)"},{"line_number":303,"context_line":"        status, headers, body \u003d \\"},{"line_number":304,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":305,"context_line":"        self.assertEqual(status, 200)"},{"line_number":306,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":307,"context_line":"        self.assertEqual(elem.find(\u0027MaxKeys\u0027).text, max_keys)"},{"line_number":308,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_d7ad06eb","side":"PARENT","line":305,"updated":"2019-05-16 23:25:21.000000000","message":"status","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        expect_objects \u003d (\u0027dir/subdir/object\u0027, \u0027object\u0027)"},{"line_number":303,"context_line":"        status, headers, body \u003d \\"},{"line_number":304,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":305,"context_line":"        self.assertEqual(status, 200)"},{"line_number":306,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":307,"context_line":"        self.assertEqual(elem.find(\u0027MaxKeys\u0027).text, max_keys)"},{"line_number":308,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_0abd8964","side":"PARENT","line":305,"in_reply_to":"bfb3d3c7_d7ad06eb","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        expect_objects \u003d (\u0027object\u0027, \u0027object2\u0027)"},{"line_number":332,"context_line":"        status, headers, body \u003d \\"},{"line_number":333,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":334,"context_line":"        self.assertEqual(status, 200)"},{"line_number":335,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":336,"context_line":"        self.assertEqual(elem.find(\u0027Prefix\u0027).text, prefix)"},{"line_number":337,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_f7936aa2","side":"PARENT","line":334,"updated":"2019-05-16 23:25:21.000000000","message":"status","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        expect_objects \u003d (\u0027object\u0027, \u0027object2\u0027)"},{"line_number":332,"context_line":"        status, headers, body \u003d \\"},{"line_number":333,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":334,"context_line":"        self.assertEqual(status, 200)"},{"line_number":335,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":336,"context_line":"        self.assertEqual(elem.find(\u0027Prefix\u0027).text, prefix)"},{"line_number":337,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_aab1dd91","side":"PARENT","line":334,"in_reply_to":"bfb3d3c7_f7936aa2","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        expect_objects \u003d (\u0027object2\u0027, \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":361,"context_line":"        status, headers, body \u003d \\"},{"line_number":362,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":363,"context_line":"        self.assertEqual(status, 200)"},{"line_number":364,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":365,"context_line":"        self.assertEqual(elem.find(\u0027StartAfter\u0027).text, marker)"},{"line_number":366,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_b78df27c","side":"PARENT","line":363,"updated":"2019-05-16 23:25:21.000000000","message":"status","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        expect_objects \u003d (\u0027object2\u0027, \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":361,"context_line":"        status, headers, body \u003d \\"},{"line_number":362,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":363,"context_line":"        self.assertEqual(status, 200)"},{"line_number":364,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":365,"context_line":"        self.assertEqual(elem.find(\u0027StartAfter\u0027).text, marker)"},{"line_number":366,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_caae912d","side":"PARENT","line":363,"in_reply_to":"bfb3d3c7_b78df27c","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":388,"context_line":"                          \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":389,"context_line":"        status, headers, body \u003d \\"},{"line_number":390,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":391,"context_line":"        self.assertEqual(status, 200)"},{"line_number":392,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":393,"context_line":"        self.assertEqual(elem.find(\u0027KeyCount\u0027).text, \u00275\u0027)"},{"line_number":394,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_37f7c2f8","side":"PARENT","line":391,"updated":"2019-05-16 23:25:21.000000000","message":"status","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":388,"context_line":"                          \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":389,"context_line":"        status, headers, body \u003d \\"},{"line_number":390,"context_line":"            self.conn.make_request(\u0027GET\u0027, bucket, query\u003dquery)"},{"line_number":391,"context_line":"        self.assertEqual(status, 200)"},{"line_number":392,"context_line":"        elem \u003d fromstring(body, \u0027ListBucketResult\u0027)"},{"line_number":393,"context_line":"        self.assertEqual(elem.find(\u0027KeyCount\u0027).text, \u00275\u0027)"},{"line_number":394,"context_line":"        resp_objects \u003d elem.findall(\u0027./Contents\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_6aabe51c","side":"PARENT","line":391,"in_reply_to":"bfb3d3c7_37f7c2f8","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"2f05025255e73c118a7d0dbaa21cc209857ffd87"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # self.assertEqual(headers[\u0027transfer-encoding\u0027], \u0027chunked\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.assertEqual(resp[\u0027Name\u0027], bucket)"},{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_bcef19af","line":78,"range":{"start_line":78,"start_character":41,"end_line":78,"end_character":43},"updated":"2019-05-16 23:25:21.000000000","message":"So was the element empty, or self-closing? I suppose it probably doesn\u0027t matter from a practical perspective...","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # self.assertEqual(headers[\u0027transfer-encoding\u0027], \u0027chunked\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        self.assertEqual(resp[\u0027Name\u0027], bucket)"},{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ca91b154","line":78,"range":{"start_line":78,"start_character":41,"end_line":78,"end_character":43},"in_reply_to":"bfb3d3c7_bcef19af","updated":"2019-05-20 23:08:03.000000000","message":"boto3 makes that opaque to us -- I imagine it doesn\u0027t matter to the end consumer really.","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.assertEqual(resp[\u0027Name\u0027], bucket)"},{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"},{"line_number":82,"context_line":"        self.assertNotIn(\u0027Contents\u0027, bucket)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_1c34254a","line":80,"updated":"2019-05-16 23:25:21.000000000","message":"What will boto3 do if we return a non-integer value for MaxKeys?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.assertEqual(resp[\u0027Name\u0027], bucket)"},{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"},{"line_number":82,"context_line":"        self.assertNotIn(\u0027Contents\u0027, bucket)"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_6a77653c","line":80,"in_reply_to":"bfb3d3c7_1c34254a","updated":"2019-05-20 23:08:03.000000000","message":"I suspect a ValueError is raised during parsing, because the JSON schema specifies the data type\n\n    \"MaxKeys\": {\"type\":\"integer\"}\n\nand the parser does:\n\n    459     @_text_content\n    460     def _handle_integer(self, shape, text):\n    461         return int(text)","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"},{"line_number":82,"context_line":"        self.assertNotIn(\u0027Contents\u0027, bucket)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        # GET Bucket(With Object)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_dc3d2d2d","line":81,"updated":"2019-05-16 23:25:21.000000000","message":"Or something other than \u0027true\u0027 or \u0027false\u0027 for IsTruncated?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cab5be83e115e2d4c771808abfa6bc875b980a4c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"},{"line_number":82,"context_line":"        self.assertNotIn(\u0027Contents\u0027, bucket)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        # GET Bucket(With Object)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ad1a427a","line":81,"in_reply_to":"bfb3d3c7_ca245110","updated":"2019-05-21 21:53:23.000000000","message":"Hmm... worth it for being on a maintained library, I suppose.","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        self.assertEqual(resp[\u0027Prefix\u0027], \u0027\u0027)"},{"line_number":79,"context_line":"        self.assertEqual(resp[\u0027Marker\u0027], \u0027\u0027)"},{"line_number":80,"context_line":"        self.assertEqual(resp[\u0027MaxKeys\u0027], max_bucket_listing)"},{"line_number":81,"context_line":"        self.assertFalse(resp[\u0027IsTruncated\u0027])"},{"line_number":82,"context_line":"        self.assertNotIn(\u0027Contents\u0027, bucket)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        # GET Bucket(With Object)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_ca245110","line":81,"in_reply_to":"bfb3d3c7_dc3d2d2d","updated":"2019-05-20 23:08:03.000000000","message":"Booleans look like they default to False.\n\n    445     def _handle_boolean(self, shape, text):\n    446         if text \u003d\u003d \u0027true\u0027:\n    447             return True\n    448         else:\n    449             return False","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        # GET Bucket(With Object)"},{"line_number":85,"context_line":"        req_objects \u003d [\u0027object\u0027, \u0027object2\u0027]"},{"line_number":86,"context_line":"        for obj in req_objects:"},{"line_number":87,"context_line":"            self.conn.put_object(Bucket\u003dbucket, Key\u003dobj, Body\u003d\u0027\u0027)"},{"line_number":88,"context_line":"        resp \u003d self.conn.list_objects(Bucket\u003dbucket)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.assertEqual(resp[\u0027Name\u0027], bucket)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_7c18c1d2","line":87,"range":{"start_line":87,"start_character":62,"end_line":87,"end_character":64},"updated":"2019-05-16 23:25:21.000000000","message":"Should this be b\u0027\u0027? How does boto3 deal with string bodies on py3?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        resp \u003d self.conn.create_bucket("},{"line_number":182,"context_line":"            Bucket\u003d\u0027bucket\u0027,"},{"line_number":183,"context_line":"            CreateBucketConfiguration\u003d{\u0027LocationConstraint\u0027: self.region})"},{"line_number":184,"context_line":"        self.assertEqual(resp[\u0027ResponseMetadata\u0027][\u0027HTTPStatusCode\u0027], 200)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_get_bucket_error(self):"},{"line_number":187,"context_line":"        event_system \u003d self.conn.meta.events"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_9c581557","line":184,"updated":"2019-05-16 23:25:21.000000000","message":"Off-topic: we should have a similar test where we try to create with the wrong region...","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        with self.assertRaises(botocore.exceptions.ClientError) as ctx:"},{"line_number":205,"context_line":"            self.conn.list_objects(Bucket\u003d\u0027nothing\u0027)"},{"line_number":206,"context_line":"        self.assertEqual("},{"line_number":207,"context_line":"            ctx.exception.response[\u0027Error\u0027][\u0027Code\u0027], \u0027NoSuchBucket\u0027)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def _prepare_test_get_bucket(self, bucket, objects):"},{"line_number":210,"context_line":"        self.conn.create_bucket(Bucket\u003dbucket)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_5c193d86","line":207,"updated":"2019-05-16 23:25:21.000000000","message":"Off-topic: these should all peek at status code, too...","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def _prepare_test_get_bucket(self, bucket, objects):"},{"line_number":210,"context_line":"        self.conn.create_bucket(Bucket\u003dbucket)"},{"line_number":211,"context_line":"        for obj in objects:"},{"line_number":212,"context_line":"            self.conn.put_object(Bucket\u003dbucket, Key\u003dobj, Body\u003d\u0027\u0027)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def test_get_bucket_with_delimiter(self):"},{"line_number":215,"context_line":"        bucket \u003d \u0027bucket\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_7c1e8171","line":212,"range":{"start_line":212,"start_character":62,"end_line":212,"end_character":64},"updated":"2019-05-16 23:25:21.000000000","message":"b\u0027\u0027?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    def _prepare_test_get_bucket(self, bucket, objects):"},{"line_number":210,"context_line":"        self.conn.create_bucket(Bucket\u003dbucket)"},{"line_number":211,"context_line":"        for obj in objects:"},{"line_number":212,"context_line":"            self.conn.put_object(Bucket\u003dbucket, Key\u003dobj, Body\u003d\u0027\u0027)"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"    def test_get_bucket_with_delimiter(self):"},{"line_number":215,"context_line":"        bucket \u003d \u0027bucket\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_8afad93f","line":212,"range":{"start_line":212,"start_character":62,"end_line":212,"end_character":64},"in_reply_to":"bfb3d3c7_7c1e8171","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        resp_prefixes \u003d resp[\u0027CommonPrefixes\u0027]"},{"line_number":227,"context_line":"        self.assertEqual(len(resp_prefixes), len(expect_prefixes))"},{"line_number":228,"context_line":"        for i, p in enumerate(resp_prefixes):"},{"line_number":229,"context_line":"            self.assertEqual(p[\u0027Prefix\u0027], expect_prefixes[i])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_get_bucket_with_encoding_type(self):"},{"line_number":232,"context_line":"        bucket \u003d \u0027bucket\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_d7118655","line":229,"updated":"2019-05-16 23:25:21.000000000","message":"What do these dicts actually look like? Could we do something like\n\n self.assertEqual(resp_prefixes, [\n     {\u0027Prefix\u0027: p} for p in expected_prefixes])\n\n?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        resp_prefixes \u003d resp[\u0027CommonPrefixes\u0027]"},{"line_number":227,"context_line":"        self.assertEqual(len(resp_prefixes), len(expect_prefixes))"},{"line_number":228,"context_line":"        for i, p in enumerate(resp_prefixes):"},{"line_number":229,"context_line":"            self.assertEqual(p[\u0027Prefix\u0027], expect_prefixes[i])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_get_bucket_with_encoding_type(self):"},{"line_number":232,"context_line":"        bucket \u003d \u0027bucket\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_8a8f39cb","line":229,"in_reply_to":"bfb3d3c7_d7118655","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    def test_get_bucket_with_encoding_type(self):"},{"line_number":232,"context_line":"        bucket \u003d \u0027bucket\u0027"},{"line_number":233,"context_line":"        put_objects \u003d (\u0027object\u0027, \u0027object2\u0027)"},{"line_number":234,"context_line":"        self._prepare_test_get_bucket(bucket, put_objects)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        encoding_type \u003d \u0027url\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_3726e2b9","line":233,"updated":"2019-05-16 23:25:21.000000000","message":"Off-topic: this test should really use some object names that would highlight the url-encoding...\n\nIf we did, would the result dicts be url-encoded? Or would boto3 deal with that transparently for us?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        expect_objects \u003d (\u0027dir/subdir/object\u0027, \u0027object\u0027, \u0027object2\u0027,"},{"line_number":297,"context_line":"                          \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":298,"context_line":"        resp \u003d self.conn.list_objects_v2(Bucket\u003dbucket, FetchOwner\u003dTrue)"},{"line_number":299,"context_line":"        self.assertEqual(resp[\u0027KeyCount\u0027], 5)"},{"line_number":300,"context_line":"        self._validate_object_listing(resp[\u0027Contents\u0027], expect_objects)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def test_get_bucket_v2_with_continuation_token_and_delimiter(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_37d02251","line":299,"updated":"2019-05-16 23:25:21.000000000","message":"Good catch; I might\u0027ve missed it in the diff. Should some of these other tests be checking KeyCount?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        expect_objects \u003d (\u0027dir/subdir/object\u0027, \u0027object\u0027, \u0027object2\u0027,"},{"line_number":297,"context_line":"                          \u0027subdir/object\u0027, \u0027subdir2/object\u0027)"},{"line_number":298,"context_line":"        resp \u003d self.conn.list_objects_v2(Bucket\u003dbucket, FetchOwner\u003dTrue)"},{"line_number":299,"context_line":"        self.assertEqual(resp[\u0027KeyCount\u0027], 5)"},{"line_number":300,"context_line":"        self._validate_object_listing(resp[\u0027Contents\u0027], expect_objects)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def test_get_bucket_v2_with_continuation_token_and_delimiter(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_2a63ad1c","line":299,"in_reply_to":"bfb3d3c7_37d02251","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                len(expected[i][\u0027objects\u0027]) + len(expected[i][\u0027subdirs\u0027]))"},{"line_number":328,"context_line":"            expect_truncated \u003d i \u003c len(expected) - 1"},{"line_number":329,"context_line":"            self.assertEqual(resp[\u0027IsTruncated\u0027], expect_truncated)"},{"line_number":330,"context_line":"            if expect_truncated:"},{"line_number":331,"context_line":"                self.assertIsNotNone(resp[\u0027NextContinuationToken\u0027])"},{"line_number":332,"context_line":"                continuation_token \u003d resp[\u0027NextContinuationToken\u0027]"},{"line_number":333,"context_line":"            self._validate_object_listing(resp[\u0027Contents\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_575fd6e4","line":330,"updated":"2019-05-16 23:25:21.000000000","message":"Off-topic: this should have an else...","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":337,"context_line":"            self.assertEqual("},{"line_number":338,"context_line":"                len(list(resp_subdirs)), len(expected[i][\u0027subdirs\u0027]))"},{"line_number":339,"context_line":"            for j, o in enumerate(resp_subdirs):"},{"line_number":340,"context_line":"                self.assertEqual(o[\u0027Prefix\u0027], expected[i][\u0027subdirs\u0027][j])"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def test_head_bucket_error(self):"},{"line_number":343,"context_line":"        event_system \u003d self.conn.meta.events"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_17595efd","line":340,"updated":"2019-05-16 23:25:21.000000000","message":"Again, depending on the format of these dicts, we could probably make this assertion better.","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":337,"context_line":"            self.assertEqual("},{"line_number":338,"context_line":"                len(list(resp_subdirs)), len(expected[i][\u0027subdirs\u0027]))"},{"line_number":339,"context_line":"            for j, o in enumerate(resp_subdirs):"},{"line_number":340,"context_line":"                self.assertEqual(o[\u0027Prefix\u0027], expected[i][\u0027subdirs\u0027][j])"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def test_head_bucket_error(self):"},{"line_number":343,"context_line":"        event_system \u003d self.conn.meta.events"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_aa5f9d3f","line":340,"in_reply_to":"bfb3d3c7_17595efd","updated":"2019-05-20 23:08:03.000000000","message":"Done","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fe9b321cad9f318fc9523966249428ae6321288d","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        event_system \u003d self.conn.meta.events"},{"line_number":409,"context_line":"        event_system.register("},{"line_number":410,"context_line":"            \u0027request-created.s3.CreateBucket\u0027,"},{"line_number":411,"context_line":"            _mangle_req_method)"},{"line_number":412,"context_line":"        # non existed verb in the controller"},{"line_number":413,"context_line":"        with self.assertRaises(botocore.exceptions.ClientError) as ctx:"},{"line_number":414,"context_line":"            self.conn.create_bucket(Bucket\u003d\u0027bucket\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_5736f6b6","line":411,"updated":"2019-05-16 23:25:21.000000000","message":"OK, how do you discover all these events? How do you discover what handlers are currently registered? For ones like the bucket-name validation, how do you discover which ones are actually causing your client-side validation trouble?","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"},{"author":{"_account_id":17363,"name":"Timur Alperovich","email":"timur@timuralp.com","username":"timuralp"},"change_message_id":"02811addc3c0aca02c64c36ad41a276d34310200","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        event_system \u003d self.conn.meta.events"},{"line_number":409,"context_line":"        event_system.register("},{"line_number":410,"context_line":"            \u0027request-created.s3.CreateBucket\u0027,"},{"line_number":411,"context_line":"            _mangle_req_method)"},{"line_number":412,"context_line":"        # non existed verb in the controller"},{"line_number":413,"context_line":"        with self.assertRaises(botocore.exceptions.ClientError) as ctx:"},{"line_number":414,"context_line":"            self.conn.create_bucket(Bucket\u003d\u0027bucket\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_8a565929","line":411,"in_reply_to":"bfb3d3c7_5736f6b6","updated":"2019-05-20 23:08:03.000000000","message":"It\u0027s... ugly. The full list of events is here:\n\n    botocore.handlers.BUILTIN_HANDLERS\n\nMost of the time we\u0027ll be messing with the registered handlers (I assume). When the failure occurs, the stacktrace does point to which handler blew up, so that part is somewhat straightforward (that\u0027s how I knew which one to mess with).","commit_id":"b0795a0fc026d78a080c3bfbfa6d752802dacd5e"}]}
