)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdec52ac350f0e91d7c3f0e1b63e977b2a7889af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"78d040e6_172c4d33","updated":"2025-09-09 17:43:41.000000000","message":"I don\u0027t generally go in for `except Exception` if I can help it -- it can really complicate running down things like `NameError`s or `AttributeError`s where it\u0027s not an issue with the DB or disk or high concurrency, but rather just my own stupidity in swithcing kyes aruond. It *definitely* doesn\u0027t seem necessary to double-wrap it like this.","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"5b5dc4c7fb10f2375335350796537a924560237c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d4ccca60_6fcd2778","updated":"2025-09-25 00:00:18.000000000","message":"Verified that my code is robust with:\n```\nvagrant@saio:~$ python3\nPython 3.10.12 (main, Aug 15 2025, 14:32:43) [GCC 11.4.0] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e from swift.container.backend import ContainerBroker\n\u003e\u003e\u003e from swift.account.backend import AccountBroker\n\u003e\u003e\u003e cb \u003d ContainerBroker(\u0027/srv/node1/sdb1/containers/729/5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3.db\u0027)\n\u003e\u003e\u003e cb.path\n\u0027AUTH_test/tetscont\u0027\n\u003e\u003e\u003e cb.db_file\n\u0027/srv/node1/sdb1/containers/729/5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3.db\u0027\n\u003e\u003e\u003e ab \u003d AccountBroker(\u0027/srv/node2/sdb2/accounts/802/178/c8bcccab3ddbfdc34b08e9223f4f5178/c8bcccab3ddbfdc34b08e9223f4f5178.db\u0027)\n\u003e\u003e\u003e ab.path\n\u0027AUTH_test\u0027\n\u003e\u003e\u003e ab.db_file\n\u0027/srv/node2/sdb2/accounts/802/178/c8bcccab3ddbfdc34b08e9223f4f5178/c8bcccab3ddbfdc34b08e9223f4f5178.db\u0027\n\u003e\u003e\u003e\n```","commit_id":"3355402e1934436320876da9fd30a9773b098905"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"35d0a3aa_fab4095f","updated":"2025-09-26 15:23:47.000000000","message":"* move the account attribute population into the get_info method like ContainerBroker (it\u0027s purposefully optimized)\n * remove code in tests that make reference to a container attribute on account brokers (it\u0027s unnecessary and confusing - so \"wrong\")\n\nPlease do not not add a bunch of untested cyclomatic complexity - rather than think \"should I have a guard path here\" or \"should I catch an error here\" think instead \"am I going to write a test to cover this branch\": if the answer is no then try not to write the code unless it\u0027s necessary (therefore implying the test is also necessary).","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8c6b9988_892087d5","updated":"2025-09-28 22:20:15.000000000","message":"Verified that new changes work!\n```\n\u003e\u003e\u003e from swift.account.backend import AccountBroker\n\u003e\u003e\u003e from swift.container.backend import ContainerBroker\n\u003e\u003e\u003e cb \u003d ContainerBroker(\u0027/srv/node1/sdb1/containers/729/5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3.db\u0027)\n\u003e\u003e\u003e cb.path\n\u0027AUTH_test/tetscont\u0027\n\u003e\u003e\u003e cb.db_file\n\u0027/srv/node1/sdb1/containers/729/5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3/b67ef1aa1b5afe3b1f5a4845ec61e5f3.db\u0027\n\u003e\u003e\u003e ab \u003d AccountBroker(\u0027/srv/node2/sdb2/accounts/802/178/c8bcccab3ddbfdc34b08e9223f4f5178/c8bcccab3ddbfdc34b08e9223f4f5178.db\u0027)\n\u003e\u003e\u003e ab.path\n\u0027AUTH_test\u0027\n\u003e\u003e\u003e ab.db_file\n\u0027/srv/node2/sdb2/accounts/802/178/c8bcccab3ddbfdc34b08e9223f4f5178/c8bcccab3ddbfdc34b08e9223f4f5178.db\u0027\n```","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a6d7229a_88216979","updated":"2025-09-29 15:40:04.000000000","message":"this is probably fine.\n\nThe tests are in the wrong spot and aren\u0027t very strong\n\n962514: test: fix AccountBroker.path tests | https://review.opendev.org/c/openstack/swift/+/962514\n\nThe implementation is spread out and the doc strings are confusing\n\n962515: trivial: reorder AccountBroker.path methods | https://review.opendev.org/c/openstack/swift/+/962515","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f0afe08c4e75fba9604f1deb12343a595cc633de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1d53bee3_429c2e0a","updated":"2025-09-29 15:41:39.000000000","message":"formatting on commit was wrong","commit_id":"2aa976ae1ebc6c00c098d833c9ddbb913a2719d7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"81c6896775a6b7f44ffd5b0c82a26049733c0ebd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e70853a7_f6586473","updated":"2025-09-29 15:42:23.000000000","message":"even better this time; I promise! 😜","commit_id":"d353f15fac3a4a1cb54efea4c9bb1f9050721a7f"}],"swift/account/backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdec52ac350f0e91d7c3f0e1b63e977b2a7889af","unresolved":true,"context_lines":[{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        try:"},{"line_number":236,"context_line":"            self._populate_instance_cache()"},{"line_number":237,"context_line":"        except Exception:"},{"line_number":238,"context_line":"            # Stay resilient during logging"},{"line_number":239,"context_line":"            return \u0027\u0027"},{"line_number":240,"context_line":"        return getattr(self, \u0027account\u0027, \u0027\u0027) or \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"e1c349aa_b2a9af61","line":237,"updated":"2025-09-09 17:43:41.000000000","message":"What exception are we expecting to escape `_populate_instance_cache`? It\u0027s already got a pretty broad quiet-all-the-exceptions try/catch.\n\nAre we going to need similar updates in the container broker? I don\u0027t see near the same degree of resiliency there; we just let any failures to get info bubble up.","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3a212ae2e76f4c9f4604df9b72f14f99e478a52b","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        try:"},{"line_number":236,"context_line":"            self._populate_instance_cache()"},{"line_number":237,"context_line":"        except Exception:"},{"line_number":238,"context_line":"            # Stay resilient during logging"},{"line_number":239,"context_line":"            return \u0027\u0027"},{"line_number":240,"context_line":"        return getattr(self, \u0027account\u0027, \u0027\u0027) or \u0027\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"997cfa6c_96d5f512","line":237,"in_reply_to":"e1c349aa_b2a9af61","updated":"2025-09-24 23:55:05.000000000","message":"Done","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdec52ac350f0e91d7c3f0e1b63e977b2a7889af","unresolved":true,"context_lines":[{"line_number":237,"context_line":"        except Exception:"},{"line_number":238,"context_line":"            # Stay resilient during logging"},{"line_number":239,"context_line":"            return \u0027\u0027"},{"line_number":240,"context_line":"        return getattr(self, \u0027account\u0027, \u0027\u0027) or \u0027\u0027"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def put_container(self, name, put_timestamp, delete_timestamp,"},{"line_number":243,"context_line":"                      object_count, bytes_used, storage_policy_index):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2cfd826b_9513337f","line":240,"updated":"2025-09-09 17:43:41.000000000","message":"I think this could get simplified to `return self.account or \u0027\u0027` -- we should [always have the attribute](https://github.com/openstack/swift/blob/2.35.0/swift/common/db.py#L339), it\u0027s just that it may be `None`, right?","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3a212ae2e76f4c9f4604df9b72f14f99e478a52b","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        except Exception:"},{"line_number":238,"context_line":"            # Stay resilient during logging"},{"line_number":239,"context_line":"            return \u0027\u0027"},{"line_number":240,"context_line":"        return getattr(self, \u0027account\u0027, \u0027\u0027) or \u0027\u0027"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def put_container(self, name, put_timestamp, delete_timestamp,"},{"line_number":243,"context_line":"                      object_count, bytes_used, storage_policy_index):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b806161e_683d9145","line":240,"in_reply_to":"2cfd826b_9513337f","updated":"2025-09-24 23:55:05.000000000","message":"Done","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdec52ac350f0e91d7c3f0e1b63e977b2a7889af","unresolved":true,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    def _populate_instance_cache(self):"},{"line_number":659,"context_line":"        # Only populate once"},{"line_number":660,"context_line":"        if getattr(self, \u0027_acct_cache_populated\u0027, False):"},{"line_number":661,"context_line":"            return"},{"line_number":662,"context_line":"        try:"},{"line_number":663,"context_line":"            with self.get() as conn:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fc95b5c8_ac3a7fbe","line":660,"updated":"2025-09-09 17:43:41.000000000","message":"Can we just use `self.account` as our flag? I was expecting something more like\n```\ndef _populate_instance_cache(self):\n    if self.account is None:\n        try:\n            ...\n```\nmore similar to what\u0027s going on [in the container broker](https://github.com/openstack/swift/blob/2.35.0/swift/container/backend.py#L935-L939).","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3a212ae2e76f4c9f4604df9b72f14f99e478a52b","unresolved":false,"context_lines":[{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    def _populate_instance_cache(self):"},{"line_number":659,"context_line":"        # Only populate once"},{"line_number":660,"context_line":"        if getattr(self, \u0027_acct_cache_populated\u0027, False):"},{"line_number":661,"context_line":"            return"},{"line_number":662,"context_line":"        try:"},{"line_number":663,"context_line":"            with self.get() as conn:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba20a857_630917b5","line":660,"in_reply_to":"fc95b5c8_ac3a7fbe","updated":"2025-09-24 23:55:05.000000000","message":"Done","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fdec52ac350f0e91d7c3f0e1b63e977b2a7889af","unresolved":true,"context_lines":[{"line_number":666,"context_line":"                if row:"},{"line_number":667,"context_line":"                    self.account \u003d row["},{"line_number":668,"context_line":"                        \u0027account\u0027] if \u0027account\u0027 in row.keys() else row[0]"},{"line_number":669,"context_line":"        except Exception:"},{"line_number":670,"context_line":"            pass"},{"line_number":671,"context_line":"        finally:"},{"line_number":672,"context_line":"            self._acct_cache_populated \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"d1a8f6ba_3b2cde70","line":672,"range":{"start_line":669,"start_character":8,"end_line":672,"end_character":45},"updated":"2025-09-09 17:43:41.000000000","message":"If it fails, do we really want to still set `_acct_cache_populated`? Why not be willing to try again the next time we come through?","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3a212ae2e76f4c9f4604df9b72f14f99e478a52b","unresolved":false,"context_lines":[{"line_number":666,"context_line":"                if row:"},{"line_number":667,"context_line":"                    self.account \u003d row["},{"line_number":668,"context_line":"                        \u0027account\u0027] if \u0027account\u0027 in row.keys() else row[0]"},{"line_number":669,"context_line":"        except Exception:"},{"line_number":670,"context_line":"            pass"},{"line_number":671,"context_line":"        finally:"},{"line_number":672,"context_line":"            self._acct_cache_populated \u003d True"}],"source_content_type":"text/x-python","patch_set":1,"id":"f8c63efd_de4c4cf2","line":672,"range":{"start_line":669,"start_character":8,"end_line":672,"end_character":45},"in_reply_to":"d1a8f6ba_3b2cde70","updated":"2025-09-24 23:55:05.000000000","message":"Done","commit_id":"64327336f657728a80ca3339f22690b01f837dfa"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":true,"context_lines":[{"line_number":233,"context_line":"        for AccountBroker we return just \"\u003caccount\u003e\"."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        if getattr(self, \u0027account\u0027, None) is None:"},{"line_number":236,"context_line":"            self._populate_instance_cache()"},{"line_number":237,"context_line":"        return self.account or \u0027\u0027"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def put_container(self, name, put_timestamp, delete_timestamp,"}],"source_content_type":"text/x-python","patch_set":7,"id":"43cc4aaf_78850b0f","line":236,"updated":"2025-09-26 15:23:47.000000000","message":"there\u0027s a built in guard return in this method - just call it; that\u0027s what ContainerBroker does.","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[{"line_number":233,"context_line":"        for AccountBroker we return just \"\u003caccount\u003e\"."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        if getattr(self, \u0027account\u0027, None) is None:"},{"line_number":236,"context_line":"            self._populate_instance_cache()"},{"line_number":237,"context_line":"        return self.account or \u0027\u0027"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def put_container(self, name, put_timestamp, delete_timestamp,"}],"source_content_type":"text/x-python","patch_set":7,"id":"b726fbd3_72c159bd","line":236,"in_reply_to":"43cc4aaf_78850b0f","updated":"2025-09-28 22:20:15.000000000","message":"Acknowledged","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"680493532d93be5c71195386f85031ae41c49534","unresolved":true,"context_lines":[{"line_number":671,"context_line":"                self.account \u003d acct"},{"line_number":672,"context_line":"            else:"},{"line_number":673,"context_line":"                if not hasattr(self, \u0027account\u0027):"},{"line_number":674,"context_line":"                    self.account \u003d None"},{"line_number":675,"context_line":"        except Exception:"},{"line_number":676,"context_line":"            if not hasattr(self, \u0027account\u0027):"},{"line_number":677,"context_line":"                self.account \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"f0e77b0a_cc650f93","line":674,"updated":"2025-09-25 19:59:00.000000000","message":"Getting better, but this still feels wordy -- everywhere else (see `_initialize`, for example) we just assume that `self.account` is a thing; it may be `None`, but it won\u0027t `AttributeError`. WDYT about something like\n```\ndiff --git a/swift/account/backend.py b/swift/account/backend.py\nindex c58bc6ea0..9460e48c0 100644\n--- a/swift/account/backend.py\n+++ b/swift/account/backend.py\n@@ -232,7 +232,7 @@ class AccountBroker(DatabaseBroker):\n         For ContainerBroker this is \"\u003caccount\u003e/\u003ccontainer\u003e\";\n         for AccountBroker we return just \"\u003caccount\u003e\".\n         \"\"\"\n-        if getattr(self, \u0027account\u0027, None) is None:\n+        if self.account is None:\n             self._populate_instance_cache()\n         return self.account or \u0027\u0027\n \n@@ -661,19 +661,12 @@ class AccountBroker(DatabaseBroker):\n         On failure, we leave `self.account` as-is (likely None) so that\n         a future caller can try again.\n         \"\"\"\n-        if getattr(self, \u0027account\u0027, None) is not None:\n+        if self.account is not None:\n             return\n \n         try:\n             info \u003d self.get_info()\n-            acct \u003d info.get(\u0027account\u0027)\n-            if acct:\n-                self.account \u003d acct\n-            else:\n-                if not hasattr(self, \u0027account\u0027):\n-                    self.account \u003d None\n+            self.account \u003d info.get(\u0027account\u0027)\n         except Exception:\n-            if not hasattr(self, \u0027account\u0027):\n-                self.account \u003d None\n             self.logger.debug(\u0027AccountBroker _populate_instance_cache\u0027\n                               \u0027failed\u0027, exc_info\u003dTrue)\n```\n?","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[{"line_number":671,"context_line":"                self.account \u003d acct"},{"line_number":672,"context_line":"            else:"},{"line_number":673,"context_line":"                if not hasattr(self, \u0027account\u0027):"},{"line_number":674,"context_line":"                    self.account \u003d None"},{"line_number":675,"context_line":"        except Exception:"},{"line_number":676,"context_line":"            if not hasattr(self, \u0027account\u0027):"},{"line_number":677,"context_line":"                self.account \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"6b36d773_c27cf0b9","line":674,"in_reply_to":"3055b8a7_884348a2","updated":"2025-09-28 22:20:15.000000000","message":"Done","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":true,"context_lines":[{"line_number":671,"context_line":"                self.account \u003d acct"},{"line_number":672,"context_line":"            else:"},{"line_number":673,"context_line":"                if not hasattr(self, \u0027account\u0027):"},{"line_number":674,"context_line":"                    self.account \u003d None"},{"line_number":675,"context_line":"        except Exception:"},{"line_number":676,"context_line":"            if not hasattr(self, \u0027account\u0027):"},{"line_number":677,"context_line":"                self.account \u003d None"}],"source_content_type":"text/x-python","patch_set":7,"id":"3055b8a7_884348a2","line":674,"in_reply_to":"f0e77b0a_cc650f93","updated":"2025-09-26 15:23:47.000000000","message":"We should copy what ContainerBroker does: the attr should be populated as a side-effect of `get_info()`\n\nI know it initially seems \"cleaner\" to set the cached info query attributes in the info_cache method/helper, but written this this we make the query *twice*?!\n\n```\n\u003e\u003e\u003e from swift.account.backend import AccountBroker\n\u003e\u003e\u003e b \u003d AccountBroker(\u0027/srv/node1/sdb1/accounts/802/178/c8bcccab3ddbfdc34b08e9223f4f5178/c8bcccab3ddbfdc34b08e9223f4f5178.db\u0027)\n\u003e\u003e\u003e b.get_info()\nget_info called!\n{\u0027account\u0027: \u0027AUTH_test\u0027, \u0027created_at\u0027: \u00271758834046.13464\u0027, \u0027put_timestamp\u0027: \u00271758834046.11772\u0027, \u0027delete_timestamp\u0027: \u00270\u0027, \u0027status_changed_at\u0027: \u00271758834046.11772\u0027, \u0027container_count\u0027: 1, \u0027object_count\u0027: 100, \u0027bytes_used\u0027: 190, \u0027hash\u0027: \u00272187fbd5acecb6627dc5fe7a1e61fefc\u0027, \u0027id\u0027: \u0027dcacd598-8c44-4174-abaf-e64809536779-sdb1\u0027}\n\u003e\u003e\u003e b.account\n\u003e\u003e\u003e b.path\nget_info called!\n\u0027AUTH_test\u0027\n\u003e\u003e\u003e b.account\n\u0027AUTH_test\u0027\n```\n\n... optimization (when necessary) is one of the few justifiable reasons for inelegance (if manageable).","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":true,"context_lines":[{"line_number":676,"context_line":"            if not hasattr(self, \u0027account\u0027):"},{"line_number":677,"context_line":"                self.account \u003d None"},{"line_number":678,"context_line":"            self.logger.debug(\u0027AccountBroker _populate_instance_cache\u0027"},{"line_number":679,"context_line":"                              \u0027failed\u0027, exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"92f80180_4ce78e75","line":679,"updated":"2025-09-26 15:23:47.000000000","message":"if you\u0027re going to have an except block here you should test it - i\u0027d suggest it\u0027s not necessary.\n\nIf you moved `self.account \u003d data[\u0027account\u0027]` into `get_info`:\n\n```\n@@ -354,14 +354,17 @@ class AccountBroker(DatabaseBroker):\n                   delete_timestamp, status_changed_at, container_count,\n                   object_count, bytes_used, hash, id\n         \"\"\"\n+        print(\u0027get_info called!\u0027)\n         self._commit_puts_stale_ok()\n         with self.get() as conn:\n-            return dict(conn.execute(\u0027\u0027\u0027\n+            data \u003d dict(conn.execute(\u0027\u0027\u0027\n                 SELECT account, created_at,  put_timestamp, delete_timestamp,\n                        status_changed_at, container_count, object_count,\n                        bytes_used, hash, id\n                 FROM account_stat\n             \u0027\u0027\u0027).fetchone())\n+        self.account \u003d data[\u0027account\u0027]\n+        return data\n \n     def list_containers_iter(self, limit, marker, end_marker, prefix,\n                              delimiter, reverse\u003dFalse, allow_reserved\u003dFalse):\n```\n\nthen this method is just:\n\n```\nif self.account is None:\n    self.get_info()\n```\n\n... which I think would be totally fine and more in the spirit of what we do in ContainerBroker.","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[{"line_number":676,"context_line":"            if not hasattr(self, \u0027account\u0027):"},{"line_number":677,"context_line":"                self.account \u003d None"},{"line_number":678,"context_line":"            self.logger.debug(\u0027AccountBroker _populate_instance_cache\u0027"},{"line_number":679,"context_line":"                              \u0027failed\u0027, exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"abbd13e1_6f0b14d4","line":679,"in_reply_to":"92f80180_4ce78e75","updated":"2025-09-28 22:20:15.000000000","message":"Done","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":229,"context_line":"        \"\"\""},{"line_number":230,"context_line":"        Logical namespace path used for logging."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        For ContainerBroker this is \"\u003caccount\u003e/\u003ccontainer\u003e\";"},{"line_number":233,"context_line":"        for AccountBroker we return just \"\u003caccount\u003e\"."},{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        if self.account is None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"58068083_6fafd5e6","line":232,"updated":"2025-09-29 15:40:04.000000000","message":"why are we documenting ContainerBroker behavior in the AccountBroker docstring?","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":234,"context_line":"        \"\"\""},{"line_number":235,"context_line":"        if self.account is None:"},{"line_number":236,"context_line":"            self._populate_instance_cache()"},{"line_number":237,"context_line":"        return self.account or \u0027\u0027"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def put_container(self, name, put_timestamp, delete_timestamp,"},{"line_number":240,"context_line":"                      object_count, bytes_used, storage_policy_index):"}],"source_content_type":"text/x-python","patch_set":8,"id":"fc9ef974_735ee2d1","line":237,"updated":"2025-09-29 15:40:04.000000000","message":"this normalization to \"path must return a string\" - I think would look better when we populate the `self.account` attribute in `get_info`\n\nThen `self.account is None` becomes a clear alias for \"we haven\u0027t run the get_info query yet\"","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def get_info(self):"},{"line_number":350,"context_line":"        \"\"\""},{"line_number":351,"context_line":"        Return a dict with account name for this broker."},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        :returns: dict with keys: account, created_at, put_timestamp,"},{"line_number":354,"context_line":"                  delete_timestamp, status_changed_at, container_count,"}],"source_content_type":"text/x-python","patch_set":8,"id":"b6467bc4_19806ad9","line":351,"updated":"2025-09-29 15:40:04.000000000","message":"why did this change!?","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":false,"context_lines":[{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        :returns: dict with keys: account, created_at, put_timestamp,"},{"line_number":354,"context_line":"                  delete_timestamp, status_changed_at, container_count,"},{"line_number":355,"context_line":"                  object_count, bytes_used, hash, id"},{"line_number":356,"context_line":"        \"\"\""},{"line_number":357,"context_line":"        self._commit_puts_stale_ok()"},{"line_number":358,"context_line":"        with self.get() as conn:"}],"source_content_type":"text/x-python","patch_set":8,"id":"0acc9ec2_4faa3a6a","line":355,"updated":"2025-09-29 15:40:04.000000000","message":"this is right.","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            data \u003d dict(conn.execute(\u0027\u0027\u0027"},{"line_number":360,"context_line":"                SELECT account, created_at,  put_timestamp, delete_timestamp,"},{"line_number":361,"context_line":"                       status_changed_at, container_count, object_count,"},{"line_number":362,"context_line":"                       bytes_used, hash, id"},{"line_number":363,"context_line":"                FROM account_stat"},{"line_number":364,"context_line":"            \u0027\u0027\u0027).fetchone())"},{"line_number":365,"context_line":"        self.account \u003d data.get(\u0027account\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"55eb9156_f4c6f60d","line":362,"updated":"2025-09-29 15:40:04.000000000","message":"we select way more than just the account name","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":362,"context_line":"                       bytes_used, hash, id"},{"line_number":363,"context_line":"                FROM account_stat"},{"line_number":364,"context_line":"            \u0027\u0027\u0027).fetchone())"},{"line_number":365,"context_line":"        self.account \u003d data.get(\u0027account\u0027)"},{"line_number":366,"context_line":"        return data"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    def list_containers_iter(self, limit, marker, end_marker, prefix,"}],"source_content_type":"text/x-python","patch_set":8,"id":"0d67b128_afb0acc8","line":365,"updated":"2025-09-29 15:40:04.000000000","message":"FWIW there\u0027s no reason to be defensive the SELECT would blow up before returning a row that doesn\u0027t have an account column/key.\n\nWe should be consistent with the ContainerBroker:\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/container/backend.py#L926\n\nAlthough if I was writing this for the first time I may have said:\n\n```\nself.account \u003d data[\u0027account\u0027] or \u0027\u0027\n```\n\nTo ensure that it\u0027s clear even if someone managed to get a null into the column after calling `get_info()` \u003d\u003e `self.account is NOT None`","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":664,"context_line":"        a future caller can try again."},{"line_number":665,"context_line":"        \"\"\""},{"line_number":666,"context_line":"        if self.account is None:"},{"line_number":667,"context_line":"            self.get_info()"}],"source_content_type":"text/x-python","patch_set":8,"id":"4375c649_37013815","line":667,"updated":"2025-09-29 15:40:04.000000000","message":"why is this method all spread out from get_info and path?\n\nImagine how much *tigher* this diff read as:\n\n```\ndiff --git a/swift/account/backend.py b/swift/account/backend.py\nindex a4d7137ee..fc8201cb0 100644\n--- a/swift/account/backend.py\n+++ b/swift/account/backend.py\n@@ -344,12 +344,33 @@ class AccountBroker(DatabaseBroker):\n         \"\"\"\n         self._commit_puts_stale_ok()\n         with self.get() as conn:\n-            return dict(conn.execute(\u0027\u0027\u0027\n+            data \u003d dict(conn.execute(\u0027\u0027\u0027\n                 SELECT account, created_at,  put_timestamp, delete_timestamp,\n                        status_changed_at, container_count, object_count,\n                        bytes_used, hash, id\n                 FROM account_stat\n             \u0027\u0027\u0027).fetchone())\n+        self.account \u003d data[\u0027account\u0027]\n+        return data\n+\n+    def _populate_instance_cache(self):\n+        \"\"\"\n+        Lazily hydrate instance attributes used for logging and other\n+        read-mostly flows. Use `self.account is None` as the only\n+        indicator that we haven\u0027t populated yet.\n+        \"\"\"\n+        if self.account is None:\n+            self.get_info()\n+\n+    @property\n+    def path(self):\n+        \"\"\"\n+        Logical namespace path used for logging.\n+\n+        For AccountBroker we return just \"\u003caccount\u003e\".\n+        \"\"\"\n+        self._populate_instance_cache()\n+        return self.account\n \n     def list_containers_iter(self, limit, marker, end_marker, prefix,\n                              delimiter, reverse\u003dFalse, allow_reserved\u003dFalse):\n```\n\n\u003e what\u0027s happening; oh we\u0027re changing get_info to set self.account - why?\n\u003e oic, so that we can \"Lazily hydrate ...\" - that makes sense, but how is it *used*!?\n\u003e oh, we call it before we return path - there you go!","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"}],"test/unit/account/test_backend.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"680493532d93be5c71195386f85031ae41c49534","unresolved":true,"context_lines":[{"line_number":1233,"context_line":"            self.assertEqual(\u0027a\u0027, b.account)"},{"line_number":1234,"context_line":"            self.assertEqual(1, called[\u0027n\u0027])"},{"line_number":1235,"context_line":"        finally:"},{"line_number":1236,"context_line":"            b._populate_instance_cache \u003d real_pop"},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa0da225_34566558","line":1236,"updated":"2025-09-25 19:59:00.000000000","message":"So... we want to `mock.patch` without using `mock.patch`? Why not something like\n```\n        def stub_populate(self, conn\u003dNone):\n            called[\u0027n\u0027] +\u003d 1\n            b.account \u003d \u0027a\u0027\n\n        with mock.patch.object(\n            AccountBroker,\n            \u0027_populate_instance_cache\u0027,\n            stub_populate,\n        ):\n            self.assertEqual(\u0027a\u0027, b.path)\n            self.assertEqual(\u0027a\u0027, b.account)\n            self.assertEqual(1, called[\u0027n\u0027])\n```\n? We stop needing to track `real_pop` ourselves, and don\u0027t need `types` at all.","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"            self.assertEqual(\u0027a\u0027, b.account)"},{"line_number":1234,"context_line":"            self.assertEqual(1, called[\u0027n\u0027])"},{"line_number":1235,"context_line":"        finally:"},{"line_number":1236,"context_line":"            b._populate_instance_cache \u003d real_pop"},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"aa9938cd_66b744a4","line":1236,"in_reply_to":"2d19da3c_7e01df8a","updated":"2025-09-28 22:20:15.000000000","message":"Done","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":true,"context_lines":[{"line_number":1233,"context_line":"            self.assertEqual(\u0027a\u0027, b.account)"},{"line_number":1234,"context_line":"            self.assertEqual(1, called[\u0027n\u0027])"},{"line_number":1235,"context_line":"        finally:"},{"line_number":1236,"context_line":"            b._populate_instance_cache \u003d real_pop"},{"line_number":1237,"context_line":""},{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"2d19da3c_7e01df8a","line":1236,"in_reply_to":"fa0da225_34566558","updated":"2025-09-26 15:23:47.000000000","message":"nit: there\u0027s lots of legacy tests that use try finally for mocking - it would be easy to copy this test pattern and easy to fix in a follow-up if we wanted.\n\nPlease prefer mock.patch for new tests; tim\u0027s diff reads significantly better to me.\n\nCool trick with MethodType...\n\n```\n    def _populate_instance_cache(self):\n```\n\n... but I don\u0027t think it\u0027s actually doing what you expect:\n\n```\n\u003e /home/vagrant/swift/test/unit/account/test_backend.py(1228)stub_populate()\n-\u003e called[\u0027n\u0027] +\u003d 1\n(Pdb) !conn\n\u003cswift.account.backend.AccountBroker object at 0x7f2c27c205b0\u003e\n```","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"680493532d93be5c71195386f85031ae41c49534","unresolved":true,"context_lines":[{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"},{"line_number":1240,"context_line":"        if hasattr(b, \u0027container\u0027):"},{"line_number":1241,"context_line":"            delattr(b, \u0027container\u0027)"},{"line_number":1242,"context_line":"        self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"4916ec76_81839504","line":1241,"updated":"2025-09-25 19:59:00.000000000","message":"Wait, what? How would we ever get a container on an `AccountBroker`?","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cccd949894d536f8d2f87a23ac830f827b1ab56b","unresolved":true,"context_lines":[{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"},{"line_number":1240,"context_line":"        if hasattr(b, \u0027container\u0027):"},{"line_number":1241,"context_line":"            delattr(b, \u0027container\u0027)"},{"line_number":1242,"context_line":"        self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"df69fae5_4f5556cf","line":1241,"in_reply_to":"4916ec76_81839504","updated":"2025-09-26 15:23:47.000000000","message":"for me tests pass with this diff:\n\n```\ndiff --git a/test/unit/account/test_backend.py b/test/unit/account/test_backend.py\nindex 5556e95b8..fc83831b1 100644\n--- a/test/unit/account/test_backend.py\n+++ b/test/unit/account/test_backend.py\n@@ -1237,8 +1237,6 @@ class TestAccountBrokerBeforeMetadata(TestAccountBroker):\n \n     def test_path_best_effort_when_partial_attrs(self):\n         b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)\n-        if hasattr(b, \u0027container\u0027):\n-            delattr(b, \u0027container\u0027)\n         self.assertEqual(\u0027a\u0027, b.path)\n \n     def tearDown(self):\n```\n\nWhile I think all of Tim\u0027s diffs look great - they read like mostly \"alternative spellings\" (so optional?) - this was the only comment that seemed to be pointing out something incorrect that really \u0027ought change.\n\nThis came up in a slack thread the other day - someone seems to have started a rumor that we should \"code defensively\" means \"write a bucnh of code that doesn\u0027t do anything\" instead of the more narrow/obvious/correct/necessary \"don\u0027t trust *user* input!!!\"\n\nIf this code WAS necessary; it\u0027d highlight a big problem (an AccountBroker with a container attribute is a BUG) - so since it can\u0027t be correct and would only hide bugs and is confusing when reading these tests: it should be removed before this merges.","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"07dc7864a4a92f40a6460391b5211b3aa1466402","unresolved":false,"context_lines":[{"line_number":1238,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1239,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"},{"line_number":1240,"context_line":"        if hasattr(b, \u0027container\u0027):"},{"line_number":1241,"context_line":"            delattr(b, \u0027container\u0027)"},{"line_number":1242,"context_line":"        self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1243,"context_line":""},{"line_number":1244,"context_line":"    def tearDown(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"b80c5792_d1bad2f5","line":1241,"in_reply_to":"df69fae5_4f5556cf","updated":"2025-09-28 22:20:15.000000000","message":"Acknowledged","commit_id":"07d230a8e8dbf760d35f023806cdda54eb0a399d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":1191,"context_line":"                             int(self.policy))"},{"line_number":1192,"context_line":""},{"line_number":1193,"context_line":""},{"line_number":1194,"context_line":"class TestAccountBrokerBeforeMetadata(TestAccountBroker):"},{"line_number":1195,"context_line":"    \"\"\""},{"line_number":1196,"context_line":"    Tests for AccountBroker against databases created before"},{"line_number":1197,"context_line":"    the metadata column was added."}],"source_content_type":"text/x-python","patch_set":8,"id":"cb7c1a24_e268c622","line":1194,"updated":"2025-09-29 15:40:04.000000000","message":"these new tests should be in the base class","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":1222,"context_line":""},{"line_number":1223,"context_line":"        def stub_populate(self, conn\u003dNone):"},{"line_number":1224,"context_line":"            called[\u0027n\u0027] +\u003d 1"},{"line_number":1225,"context_line":"            self.account \u003d \u0027a\u0027"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"        with mock.patch.object(AccountBroker, \u0027_populate_instance_cache\u0027,"},{"line_number":1228,"context_line":"                               stub_populate):"}],"source_content_type":"text/x-python","patch_set":8,"id":"a46870d2_09ea019b","line":1225,"updated":"2025-09-29 15:40:04.000000000","message":"this seems a little on the nose - it would be better if we allowed the code that\u0027s actually responsible for this execute so that it feels like we\u0027re testing something more than \"the `path` property calls `_populate_instance_cache`\"","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":1228,"context_line":"                               stub_populate):"},{"line_number":1229,"context_line":"            self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1230,"context_line":"            self.assertEqual(\u0027a\u0027, b.account)"},{"line_number":1231,"context_line":"            self.assertEqual(1, called[\u0027n\u0027])"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1234,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"de309570_da296843","line":1231,"updated":"2025-09-29 15:40:04.000000000","message":"this is not bad; but maybe stronger if you accessed the path and account attributes mutltiple times?  Or better yet track calls to get get_info method - which is the expensive call we actually care to memoize!","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":1230,"context_line":"            self.assertEqual(\u0027a\u0027, b.account)"},{"line_number":1231,"context_line":"            self.assertEqual(1, called[\u0027n\u0027])"},{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1234,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"},{"line_number":1235,"context_line":"        self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1236,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"54c6d4f5_995e60e8","line":1233,"updated":"2025-09-29 15:40:04.000000000","message":"what is the \"partial attr\" here?  There\u0027s only account - it\u0027s and path is an alias?","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e99bfb78962a3a8665af1219c2b9af2e3a621a1a","unresolved":true,"context_lines":[{"line_number":1232,"context_line":""},{"line_number":1233,"context_line":"    def test_path_best_effort_when_partial_attrs(self):"},{"line_number":1234,"context_line":"        b \u003d AccountBroker(self.get_db_path(), account\u003d\u0027a\u0027)"},{"line_number":1235,"context_line":"        self.assertEqual(\u0027a\u0027, b.path)"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"    def tearDown(self):"},{"line_number":1238,"context_line":"        AccountBroker.create_account_stat_table \u003d \\"}],"source_content_type":"text/x-python","patch_set":8,"id":"06182e4a_63afcab4","line":1235,"updated":"2025-09-29 15:40:04.000000000","message":"should this be counting/capturing calls get get_info to demonstrate that when you create the broker with kwargs we don\u0027t validate the results against the table?","commit_id":"388656ab1b429eb7ec317b3f14fef58dcd4a81bd"}]}
