)]}'
{"swift/obj/diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def _encode_metadata(metadata):"},{"line_number":118,"context_line":"    \"\"\""},{"line_number":119,"context_line":"    Ensure that all keys and values in metadata dict are encoded valid utf8"},{"line_number":120,"context_line":"    :param metadata: a dict"},{"line_number":121,"context_line":"    \"\"\""},{"line_number":122,"context_line":"    def encode_str(item):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_fff0dbcb","line":119,"range":{"start_line":119,"start_character":53,"end_line":119,"end_character":75},"updated":"2017-04-17 22:45:18.000000000","message":"This is inaccurate; if it wasn\u0027t unicode no encoding is performed, and under no circumstances do we do any sort of validation. This is a good thing, I guess; we apparently have ~160 tests that expect to be able to send in values that are ints, floats, or bools :-/","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"def _encode_metadata(metadata):"},{"line_number":118,"context_line":"    \"\"\""},{"line_number":119,"context_line":"    Ensure that all keys and values in metadata dict are encoded valid utf8"},{"line_number":120,"context_line":"    :param metadata: a dict"},{"line_number":121,"context_line":"    \"\"\""},{"line_number":122,"context_line":"    def encode_str(item):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_abd32038","line":119,"range":{"start_line":119,"start_character":53,"end_line":119,"end_character":75},"in_reply_to":"7ffa3b31_fff0dbcb","updated":"2017-04-18 15:06:24.000000000","message":"Done","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        # TODO: we might want to re-raise errors that don\u0027t denote a missing"},{"line_number":155,"context_line":"        # xattr here.  Seems to be ENODATA on linux and ENOATTR on BSD/OSX."},{"line_number":156,"context_line":"    # strings are utf-8 encoded when written, but have not always been"},{"line_number":157,"context_line":"    # (see https://bugs.launchpad.net/swift/+bug/1680731) so encode them again"},{"line_number":158,"context_line":"    # when read"},{"line_number":159,"context_line":"    return _encode_metadata(pickle.loads(metadata))"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_d6ebccd9","line":157,"updated":"2017-04-17 22:45:18.000000000","message":"Is that the right bug? I\u0027m not sure I get the relevance.","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        # TODO: we might want to re-raise errors that don\u0027t denote a missing"},{"line_number":155,"context_line":"        # xattr here.  Seems to be ENODATA on linux and ENOATTR on BSD/OSX."},{"line_number":156,"context_line":"    # strings are utf-8 encoded when written, but have not always been"},{"line_number":157,"context_line":"    # (see https://bugs.launchpad.net/swift/+bug/1680731) so encode them again"},{"line_number":158,"context_line":"    # when read"},{"line_number":159,"context_line":"    return _encode_metadata(pickle.loads(metadata))"},{"line_number":160,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_2b227053","line":157,"in_reply_to":"7ffa3b31_d6ebccd9","updated":"2017-04-18 15:06:24.000000000","message":"Gah, sorry - that\u0027s the other bug I was working on! Fixed.","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"}],"test/probe/test_reconstructor_rebuild.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        headers \u003d {"},{"line_number":85,"context_line":"            \u0027x-object-meta-foo\u0027: self._make_name(\u0027meta-foo-\u0027).decode(\u0027utf8\u0027)}"},{"line_number":86,"context_line":"        self.headers_post \u003d {"},{"line_number":87,"context_line":"            \u0027x-object-meta-bar\u0027: self._make_name(\u0027meta-bar-\u0027).decode(\u0027utf8\u0027)}"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.etag \u003d client.put_object(self.url, self.token,"},{"line_number":90,"context_line":"                                      self.container_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_76abd888","line":87,"updated":"2017-04-17 22:45:18.000000000","message":"Worth putting some non-ascii unicode in the header name, too?\n\nWhat about non-utf8 bytes, like \u0027\\xff\u0027?","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        headers \u003d {"},{"line_number":85,"context_line":"            \u0027x-object-meta-foo\u0027: self._make_name(\u0027meta-foo-\u0027).decode(\u0027utf8\u0027)}"},{"line_number":86,"context_line":"        self.headers_post \u003d {"},{"line_number":87,"context_line":"            \u0027x-object-meta-bar\u0027: self._make_name(\u0027meta-bar-\u0027).decode(\u0027utf8\u0027)}"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        self.etag \u003d client.put_object(self.url, self.token,"},{"line_number":90,"context_line":"                                      self.container_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_01ad5330","line":87,"in_reply_to":"7ffa3b31_76abd888","updated":"2017-04-18 15:06:24.000000000","message":"Done the non-ascii in header name.\n\nAssertions for non-utf8 may become confusing because swiftclient quotes and decodes response headers to utf8 (see swiftclient.client.parse_header_string)\n\nI added some non-utf8 assertions to the test inn test_diskfile","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        metadata \u003d {\u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":292,"context_line":"                    \u0027Content-Length\u0027: 99,"},{"line_number":293,"context_line":"                    u\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027: 4,"},{"line_number":294,"context_line":"                    u\u0027X-Object-Meta-Strange\u0027: u\u0027should be bytes\u0027}"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        def check_metadata():"},{"line_number":297,"context_line":"            with open(path, \u0027rb\u0027) as fd:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_5f38ef3b","line":294,"updated":"2017-04-17 22:45:18.000000000","message":"Should we try with some non-ascii unicode?","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":291,"context_line":"        metadata \u003d {\u0027name\u0027: \u0027/a/c/o\u0027,"},{"line_number":292,"context_line":"                    \u0027Content-Length\u0027: 99,"},{"line_number":293,"context_line":"                    u\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027: 4,"},{"line_number":294,"context_line":"                    u\u0027X-Object-Meta-Strange\u0027: u\u0027should be bytes\u0027}"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        def check_metadata():"},{"line_number":297,"context_line":"            with open(path, \u0027rb\u0027) as fd:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_4ef6eafb","line":294,"in_reply_to":"7ffa3b31_5f38ef3b","updated":"2017-04-18 15:06:24.000000000","message":"Done","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            self.assertEqual(metadata, actual)"},{"line_number":300,"context_line":"            for k in actual.keys():"},{"line_number":301,"context_line":"                self.assertIsInstance(k, six.binary_type)"},{"line_number":302,"context_line":"            for k in (\u0027name\u0027, \u0027X-Object-Meta-Strange\u0027):"},{"line_number":303,"context_line":"                self.assertIsInstance(actual[k], six.binary_type)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(path, \u0027wb\u0027) as fd:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_7fb28be8","line":302,"updated":"2017-04-17 22:45:18.000000000","message":"nit: We seem to be trying to prep for py3 compatibility with the references to six.*_type -- in keeping with that, these should be b\u0027name\u0027 and b\u0027X-Object-Meta-Strange\u0027","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            self.assertEqual(metadata, actual)"},{"line_number":300,"context_line":"            for k in actual.keys():"},{"line_number":301,"context_line":"                self.assertIsInstance(k, six.binary_type)"},{"line_number":302,"context_line":"            for k in (\u0027name\u0027, \u0027X-Object-Meta-Strange\u0027):"},{"line_number":303,"context_line":"                self.assertIsInstance(actual[k], six.binary_type)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        with open(path, \u0027wb\u0027) as fd:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_ce8c3a81","line":302,"in_reply_to":"7ffa3b31_7fb28be8","updated":"2017-04-18 15:06:24.000000000","message":"Done","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"def19e28ea99f69e3533d7c9855b105fe15d622e","unresolved":false,"context_lines":[{"line_number":308,"context_line":""},{"line_number":309,"context_line":"        # mock the read path to check the write path encoded persisted metadata"},{"line_number":310,"context_line":"        with mock.patch.object(diskfile, \u0027_encode_metadata\u0027, lambda x: x):"},{"line_number":311,"context_line":"            check_metadata()"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        # simulate a legacy diskfile that might have persisted unicode metadata"},{"line_number":314,"context_line":"        with mock.patch.object(diskfile, \u0027_encode_metadata\u0027, lambda x: x):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_970afa23","line":311,"updated":"2017-04-16 20:14:33.000000000","message":"nice","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be22fbd981928f896bb5aface26f88eda7bab722","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                    \u0027Content-Length\u0027: 99,"},{"line_number":293,"context_line":"                    u\u0027X-Object-Sysmeta-Ec-Frag-Index\u0027: 4,"},{"line_number":294,"context_line":"                    u\u0027X-Object-Meta-Strange\u0027: u\u0027should be bytes\u0027,"},{"line_number":295,"context_line":"                    \u0027X-Object-Meta-x\\xff\u0027: \u0027not utf8 \\xff\u0027,"},{"line_number":296,"context_line":"                    u\u0027X-Object-Meta-y\\xe8\u0027: u\u0027not ascii \\xe8\u0027}"},{"line_number":297,"context_line":"        expected \u003d {b\u0027name\u0027: b\u0027/a/c/o\u0027,"},{"line_number":298,"context_line":"                    b\u0027Content-Length\u0027: 99,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7ffa3b31_6eeabb0f","line":295,"updated":"2017-04-18 18:45:27.000000000","message":"nit: might want to flag these as explicitly bytes. On py3, \u0027\\xff\u0027 is ÿ, but b\u0027\\xff\u0027 is some non-UTF8 binary data.","commit_id":"95b06d55fea9430aa94968db8938f08d32880490"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"be22fbd981928f896bb5aface26f88eda7bab722","unresolved":false,"context_lines":[{"line_number":329,"context_line":"            with open(path, \u0027rb\u0027) as fd:"},{"line_number":330,"context_line":"                actual \u003d diskfile.read_metadata(fd)"},{"line_number":331,"context_line":"                for k, v in actual.items():"},{"line_number":332,"context_line":"                    if k \u003d\u003d b\u0027X-Object-Meta-Strange\u0027:"},{"line_number":333,"context_line":"                        self.assertIsInstance(k, six.text_type)"},{"line_number":334,"context_line":"                        self.assertIsInstance(v, six.text_type)"},{"line_number":335,"context_line":"                        break"}],"source_content_type":"text/x-python","patch_set":5,"id":"7ffa3b31_ce654fe3","line":332,"updated":"2017-04-18 18:45:27.000000000","message":"nit: Too far! This one *should* be unicode, because we wanted to check that we persisted unicode. Native string is OK, too, since\n\n b\u0027X-Object-Meta-Strange\u0027 \u003d\u003d u\u0027X-Object-Meta-Strange\u0027\n\nunder py2 (but not py3!)\n\nI hate trying to write code that can run under both :-(","commit_id":"95b06d55fea9430aa94968db8938f08d32880490"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1b8feb3fb32315181b82cc4fa01c3e59ceae75fa","unresolved":false,"context_lines":[{"line_number":7264,"context_line":"                         \u0027X-Timestamp\u0027: put_timestamp.normal,"},{"line_number":7265,"context_line":"                         \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":7266,"context_line":"        self.assertIsNotNone(actual_meta.pop(\u0027ETag\u0027, None))"},{"line_number":7267,"context_line":"        self.assertEqual(expected_meta, actual_meta)"},{"line_number":7268,"context_line":"        # but no other files"},{"line_number":7269,"context_line":"        self.assertFalse(found_files[\u0027.data\u0027][1:])"},{"line_number":7270,"context_line":"        found_files.pop(\u0027.data\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_ffda1b15","line":7267,"updated":"2017-04-17 22:45:18.000000000","message":"This is probably a good idea -- but it doesn\u0027t seem to fail if I revert the changes in diskfile.py? Is that intentional?","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1083909613432618d3acc74bb5f19e97380f656e","unresolved":false,"context_lines":[{"line_number":7264,"context_line":"                         \u0027X-Timestamp\u0027: put_timestamp.normal,"},{"line_number":7265,"context_line":"                         \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":7266,"context_line":"        self.assertIsNotNone(actual_meta.pop(\u0027ETag\u0027, None))"},{"line_number":7267,"context_line":"        self.assertEqual(expected_meta, actual_meta)"},{"line_number":7268,"context_line":"        # but no other files"},{"line_number":7269,"context_line":"        self.assertFalse(found_files[\u0027.data\u0027][1:])"},{"line_number":7270,"context_line":"        found_files.pop(\u0027.data\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7ffa3b31_6e14064f","line":7267,"in_reply_to":"7ffa3b31_ffda1b15","updated":"2017-04-18 15:06:24.000000000","message":"IIRC I noticed it was a missing opportunity to assert metadata correctness, but it would benefit from some type assertions too.","commit_id":"4a1ebf1a8143c508fe2d4fba4b258881cbaefdbd"}]}
