)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"52fdcb29b20f1d0629709ee9438b7419244e78fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6eeeb0ed_0e5721cc","updated":"2023-06-27 14:27:56.000000000","message":"@Tim did you have any more to do here? - seems good to merge","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"49a4b473928bf0ad9ae56f337ed75cfff641c181","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"b6c67fb0_9dbd4584","updated":"2023-06-20 12:35:37.000000000","message":"I think this will be a little less confusing when we try to patch for tests.\n\nSee https://review.opendev.org/c/openstack/swift/+/883788/4/test/debug_logger.py#262 for example that will be simpler for this change.","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"19075536d2b18f637c8804823c44a250f3395b44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7115548a_de7b0fce","updated":"2023-06-28 04:35:09.000000000","message":"Love it, I\u0027ll land this and rebase 883788 off it. It\u0027ll clean that up a bunch too! Thanks Tim!","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ea2cc9c71fd9b74d5e0a5db3dc8ceaa113a7095c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cdd07f01_9091bf2e","updated":"2023-06-13 22:24:28.000000000","message":"looks like zuul is happy with it - dunno why flake8 doesn\u0027t complain about the un-used/re-defined func var... maybe i\u0027m missing something?","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f37f7ca75d32429cfb1f2d65df7d4ade75ece82","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"17156eab_cd51b519","in_reply_to":"6eeeb0ed_0e5721cc","updated":"2023-06-27 18:07:04.000000000","message":"I guess if we _wanted_, we could `del statsd_delegate` after using it, or hoist it up to be a module-level function... and we could have a test that exercises things in such a way as to demonstrate the problem... but I think that\u0027ll naturally come out of https://review.opendev.org/c/openstack/swift/+/883788 if/when we beef up our testing infrastructure for metrics.\n\nSo no, I don\u0027t really plan to do anything else with this.","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ea2cc9c71fd9b74d5e0a5db3dc8ceaa113a7095c","unresolved":true,"context_lines":[{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"        :param statsd_func_name: the name of a method on StatsdClient."},{"line_number":1665,"context_line":"        \"\"\""},{"line_number":1666,"context_line":"        func \u003d getattr(StatsdClient, statsd_func_name)"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"        @functools.wraps(func)"},{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"38f61432_b52de960","line":1666,"updated":"2023-06-13 22:24:28.000000000","message":"so we can probably kill this, then?","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a14add8d5963190de24f08e7c931e44e042fb38","unresolved":true,"context_lines":[{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"        :param statsd_func_name: the name of a method on StatsdClient."},{"line_number":1665,"context_line":"        \"\"\""},{"line_number":1666,"context_line":"        func \u003d getattr(StatsdClient, statsd_func_name)"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"        @functools.wraps(func)"},{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"96b52582_92fed7b9","line":1666,"in_reply_to":"38f61432_b52de960","updated":"2023-06-14 00:17:08.000000000","message":"Still used for the `functools.wraps` to carry forward `__doc__`, `__name__`, etc.","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"371c90a0d41e8c478e0e97498a34d6315f4815f7","unresolved":true,"context_lines":[{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"        :param statsd_func_name: the name of a method on StatsdClient."},{"line_number":1665,"context_line":"        \"\"\""},{"line_number":1666,"context_line":"        func \u003d getattr(StatsdClient, statsd_func_name)"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"        @functools.wraps(func)"},{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"a1dcb342_b4cf93c9","line":1666,"in_reply_to":"96b52582_92fed7b9","updated":"2023-06-20 01:56:24.000000000","message":"Okay but why we aren\u0027t looking for an attribute of self.logger.statsd_client here, then? I\u0027m pretty sure LoggerAdapter sets it in \\__init__() somewhere, so it should be available here. Why stick to StatsdClient like before, and not be consistent with the new code? Maybe it has a more relevant \\__name__.","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"15c5948b8a80e208c8b9b7f390496496ec69c31d","unresolved":true,"context_lines":[{"line_number":1663,"context_line":""},{"line_number":1664,"context_line":"        :param statsd_func_name: the name of a method on StatsdClient."},{"line_number":1665,"context_line":"        \"\"\""},{"line_number":1666,"context_line":"        func \u003d getattr(StatsdClient, statsd_func_name)"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"        @functools.wraps(func)"},{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9869eb2e_11d8771e","line":1666,"in_reply_to":"a1dcb342_b4cf93c9","updated":"2023-06-20 16:17:45.000000000","message":"We don\u0027t have a `self` yet; it only comes in scope inside `wrapped`, *after* the whole class has been defined, but we want the `wraps` while we\u0027re still defining methods/properties.\n\nCome to think of it, it\u0027s weird that we leave a `statsd_delegate` defined on the class...","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ea2cc9c71fd9b74d5e0a5db3dc8ceaa113a7095c","unresolved":true,"context_lines":[{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"},{"line_number":1670,"context_line":"            if getattr(self.logger, \u0027statsd_client\u0027):"},{"line_number":1671,"context_line":"                func \u003d getattr(self.logger.statsd_client, statsd_func_name)"},{"line_number":1672,"context_line":"                return func(*a, **kw)"},{"line_number":1673,"context_line":"        return wrapped"},{"line_number":1674,"context_line":""},{"line_number":1675,"context_line":"    update_stats \u003d statsd_delegate(\u0027update_stats\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b89ff38c_5e9f1105","line":1672,"updated":"2023-06-13 22:24:28.000000000","message":"yeah, we get it off the instance and call it - that makes sense to me","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"19075536d2b18f637c8804823c44a250f3395b44","unresolved":true,"context_lines":[{"line_number":1669,"context_line":"        def wrapped(self, *a, **kw):"},{"line_number":1670,"context_line":"            if getattr(self.logger, \u0027statsd_client\u0027):"},{"line_number":1671,"context_line":"                func \u003d getattr(self.logger.statsd_client, statsd_func_name)"},{"line_number":1672,"context_line":"                return func(*a, **kw)"},{"line_number":1673,"context_line":"        return wrapped"},{"line_number":1674,"context_line":""},{"line_number":1675,"context_line":"    update_stats \u003d statsd_delegate(\u0027update_stats\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"f21faa4a_d1623c7b","line":1672,"in_reply_to":"b89ff38c_5e9f1105","updated":"2023-06-28 04:35:09.000000000","message":"Yeah love this! Because when writing the FakeStatsdClient we\u0027d pull methos off the original class rather then the actual client being used, when this class is subclassed it\u0027ll mean I\u0027d be calling the original statsdclient methods rather then my faked ones.","commit_id":"4c986d97bc1eeb6eb25d6571cc2b9071513e70e7"}]}
