)]}'
{"test/unit/common/middleware/test_symlink.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"67dd1c3ec401e0649e7628360be229d59afde06a","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        req \u003d Request.blank("},{"line_number":551,"context_line":"            \u0027/v1/a/tgt_cont/tgt_obj?symlink\u003dget\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":552,"context_line":"            headers\u003d{\u0027X-Copy-From\u0027: \u0027src_cont/symlink\u0027})"},{"line_number":553,"context_line":"        self._test_copy_symlink(req)"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def _test_copy_symlink(self, req):"},{"line_number":556,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/src_cont/symlink\u0027, swob.HTTPOk,"}],"source_content_type":"text/x-python","patch_set":3,"id":"df87a7cf_a20cc13b","line":553,"updated":"2017-12-13 17:20:15.000000000","message":"beautiful refactoring","commit_id":"bb60fd83243a17d83299bd1d9528cb5d8f6bd8ae"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5e27fb77b24b0e4087cd591c8fa99813c233c15e","unresolved":false,"context_lines":[{"line_number":531,"context_line":"        req \u003d Request.blank(\u0027/v1/a/src_cont/symlink\u0027, method\u003d\u0027COPY\u0027,"},{"line_number":532,"context_line":"                            headers\u003d{\u0027Destination\u0027: \u0027tgt_cont/tgt_obj\u0027})"},{"line_number":533,"context_line":"        self._test_copy_symlink_target(req)"},{"line_number":534,"context_line":"        req \u003d Request.blank(\u0027/v1/a/tgt_cont/tgt_obj\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":535,"context_line":"                            headers\u003d{\u0027X-Copy-From\u0027: \u0027src_cont/symlink\u0027})"},{"line_number":536,"context_line":"        self._test_copy_symlink_target(req)"},{"line_number":537,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_58fedc38","line":534,"range":{"start_line":534,"start_character":35,"end_line":534,"end_character":51},"updated":"2017-12-15 06:29:54.000000000","message":"nit: given our naming conventions, this might be better as dest_cont/dest_obj -- as it was, I needed a moment to realize that the symlink target was over at c1/o.","commit_id":"c579e99126b61466fb3b1628170cbca37ccacce3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5e27fb77b24b0e4087cd591c8fa99813c233c15e","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        method, path, hdrs \u003d self.app.calls_with_headers[1]"},{"line_number":551,"context_line":"        self.assertEqual(method, \u0027GET\u0027)"},{"line_number":552,"context_line":"        self.assertEqual(path, \u0027/v1/a2/c1/o\u0027)"},{"line_number":553,"context_line":"        self.assertEqual(\u0027/src_cont/symlink\u0027, hdrs.get(\u0027X-Copy-From\u0027))"},{"line_number":554,"context_line":"        method, path, hdrs \u003d self.app.calls_with_headers[2]"},{"line_number":555,"context_line":"        self.assertEqual(method, \u0027PUT\u0027)"},{"line_number":556,"context_line":"        val \u003d hdrs.get(\u0027X-Object-Sysmeta-Symlink-Target\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_387678da","line":553,"updated":"2017-12-15 06:29:54.000000000","message":"Interesting... I hadn\u0027t really thought about how the X-Copy-From is preserved in the GETs... or how that header can now be something other than the current GET path. I wonder if anyone ever tries to look for that (presumably, in some 3rd-party middleware)....","commit_id":"c579e99126b61466fb3b1628170cbca37ccacce3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5e27fb77b24b0e4087cd591c8fa99813c233c15e","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        self.assertEqual(method, \u0027PUT\u0027)"},{"line_number":556,"context_line":"        val \u003d hdrs.get(\u0027X-Object-Sysmeta-Symlink-Target\u0027)"},{"line_number":557,"context_line":"        # this is raw object copy"},{"line_number":558,"context_line":"        self.assertEqual(val, None)"},{"line_number":559,"context_line":"        self.assertEqual(status, \u0027201 Created\u0027)"},{"line_number":560,"context_line":""},{"line_number":561,"context_line":"    def test_copy_symlink(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_b8628815","line":558,"updated":"2017-12-15 06:29:54.000000000","message":"nit: I might prefer taking a slightly more holistic approach:\n\n self.assertEqual(self.app.calls, [\n     (\u0027GET\u0027, \u0027/v1/a/src_cont/symlink\u0027),\n     (\u0027GET\u0027, \u0027/v1/a2/c1/o\u0027),\n     (\u0027PUT\u0027, \u0027/v1/a/tgt_cont/tgt_obj\u0027),\n ])\n\n... and then make assertions about the headers after we\u0027ve outlined the major methods \u0026 paths.","commit_id":"c579e99126b61466fb3b1628170cbca37ccacce3"}]}
