Skip to content

Commit c9dcddb

Browse files
jopemachineclaude
andcommitted
refactor(BA-5528): rename misleading pop* methods on chat cache/config
Python's `pop` convention (`dict.pop`, `list.pop`) implies the popped value is returned, but these methods return a plain `bool` because every caller only needs "did anything actually get removed?" Renaming so the method names match what the calls do: - `DeploymentChatCache.pop` → `delete` (removes the entry) - `DeploymentChatConfig.pop` → `delete` (removes the entry) - `DeploymentChatConfig.pop_token` → `clear_token` (nulls the field, drops the entry only when both fields are unset) - `DeploymentChatConfig.pop_model` → `clear_model` (same shape as `clear_token`) `pop_token`/`pop_model` were already misnomers — they null one field rather than fully popping the entry, so `clear_*` reflects the actual behavior. Return types stay `bool` since no caller uses the popped value. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 93185ec commit c9dcddb

3 files changed

Lines changed: 36 additions & 26 deletions

File tree

src/ai/backend/client/cli/v2/deployment/chat/commands.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ async def _run() -> None:
191191
# hint instead of silently re-sending a stale key. Other
192192
# BackendAPIErrors fall through to ``_run_async`` which formats
193193
# the manager-style status/title/msg payload generically.
194-
if token is not None and chat_config.pop_token(deployment_id):
194+
if token is not None and chat_config.clear_token(deployment_id):
195195
chat_config.save()
196196
raise click.ClickException(
197197
f"The inference endpoint rejected the configured token for "
@@ -305,7 +305,7 @@ def clear(deployment_id: DeploymentID) -> None:
305305
``./bai deployment chat-cache clear`` to drop it immediately.
306306
"""
307307
config = DeploymentChatConfig.load()
308-
if config.pop(deployment_id):
308+
if config.delete(deployment_id):
309309
config.save()
310310
print(f"Removed config entry for deployment {deployment_id}.")
311311
else:
@@ -350,7 +350,7 @@ def cache_clear(deployment_id: DeploymentID) -> None:
350350
user-managed config entry (token + model) is left alone.
351351
"""
352352
cache = DeploymentChatCache.load()
353-
if cache.pop(deployment_id):
353+
if cache.delete(deployment_id):
354354
cache.save()
355355
print(f"Removed cache entry for deployment {deployment_id}.")
356356
else:

src/ai/backend/client/cli/v2/deployment/chat/types.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ def get(self, deployment_id: DeploymentID) -> DeploymentChatCacheEntry | None:
5959
def set(self, deployment_id: DeploymentID, entry: DeploymentChatCacheEntry) -> None:
6060
self.deployments[deployment_id] = entry
6161

62-
def pop(self, deployment_id: DeploymentID) -> bool:
62+
def delete(self, deployment_id: DeploymentID) -> bool:
63+
"""Remove the cache entry for ``deployment_id``; return True when an entry was removed."""
6364
return self.deployments.pop(deployment_id, None) is not None
6465

6566
@classmethod
@@ -124,7 +125,11 @@ def set_token(self, deployment_id: DeploymentID, token: str) -> None:
124125
def set_model(self, deployment_id: DeploymentID, model: str) -> None:
125126
self.deployments[deployment_id].model = model
126127

127-
def pop_token(self, deployment_id: DeploymentID) -> bool:
128+
def clear_token(self, deployment_id: DeploymentID) -> bool:
129+
"""Null the token field for ``deployment_id``; return True when a token was cleared.
130+
131+
Drops the entry entirely if both ``token`` and ``model`` end up unset.
132+
"""
128133
entry = self.deployments.get(deployment_id)
129134
if entry is None or entry.token is None:
130135
return False
@@ -133,7 +138,11 @@ def pop_token(self, deployment_id: DeploymentID) -> bool:
133138
del self.deployments[deployment_id]
134139
return True
135140

136-
def pop_model(self, deployment_id: DeploymentID) -> bool:
141+
def clear_model(self, deployment_id: DeploymentID) -> bool:
142+
"""Null the model field for ``deployment_id``; return True when a model was cleared.
143+
144+
Drops the entry entirely if both ``token`` and ``model`` end up unset.
145+
"""
137146
entry = self.deployments.get(deployment_id)
138147
if entry is None or entry.model is None:
139148
return False
@@ -142,7 +151,8 @@ def pop_model(self, deployment_id: DeploymentID) -> bool:
142151
del self.deployments[deployment_id]
143152
return True
144153

145-
def pop(self, deployment_id: DeploymentID) -> bool:
154+
def delete(self, deployment_id: DeploymentID) -> bool:
155+
"""Remove the config entry for ``deployment_id``; return True when an entry was removed."""
146156
return self.deployments.pop(deployment_id, None) is not None
147157

148158
@classmethod

tests/unit/client/cli/test_deployment_chat_types.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,20 @@ def test_set_overwrites_existing_entry(
6666
assert stored is not None
6767
assert stored.default_model == "m2"
6868

69-
def test_pop_returns_true_when_present(
69+
def test_delete_returns_true_when_present(
7070
self,
7171
cache: DeploymentChatCache,
7272
cache_entry: DeploymentChatCacheEntry,
7373
deployment_id: UUID,
7474
) -> None:
7575
cache.set(deployment_id, cache_entry)
76-
assert cache.pop(deployment_id) is True
76+
assert cache.delete(deployment_id) is True
7777
assert cache.get(deployment_id) is None
7878

79-
def test_pop_returns_false_when_absent(
79+
def test_delete_returns_false_when_absent(
8080
self, cache: DeploymentChatCache, deployment_id: UUID
8181
) -> None:
82-
assert cache.pop(deployment_id) is False
82+
assert cache.delete(deployment_id) is False
8383

8484

8585
class TestConfigTokenStore:
@@ -96,24 +96,24 @@ def test_set_overwrites_existing_token(
9696
chat_config.set_token(deployment_id, "sk-new")
9797
assert chat_config.get_token(deployment_id) == "sk-new"
9898

99-
def test_pop_token_returns_true_when_present(
99+
def test_clear_token_returns_true_when_present(
100100
self, chat_config: DeploymentChatConfig, deployment_id: UUID
101101
) -> None:
102102
chat_config.set_token(deployment_id, "sk-x")
103-
assert chat_config.pop_token(deployment_id) is True
103+
assert chat_config.clear_token(deployment_id) is True
104104
assert chat_config.get_token(deployment_id) is None
105105

106-
def test_pop_token_returns_false_when_absent(
106+
def test_clear_token_returns_false_when_absent(
107107
self, chat_config: DeploymentChatConfig, deployment_id: UUID
108108
) -> None:
109-
assert chat_config.pop_token(deployment_id) is False
109+
assert chat_config.clear_token(deployment_id) is False
110110

111-
def test_pop_token_keeps_entry_when_model_remains(
111+
def test_clear_token_keeps_entry_when_model_remains(
112112
self, chat_config: DeploymentChatConfig, deployment_id: UUID
113113
) -> None:
114114
chat_config.set_token(deployment_id, "sk-x")
115115
chat_config.set_model(deployment_id, "llama-3-8b")
116-
assert chat_config.pop_token(deployment_id) is True
116+
assert chat_config.clear_token(deployment_id) is True
117117
# Model side of the entry survives token removal.
118118
entry = chat_config.get(deployment_id)
119119
assert entry is not None
@@ -135,17 +135,17 @@ def test_set_overwrites_existing_model(
135135
chat_config.set_model(deployment_id, "new-model")
136136
assert chat_config.get_model(deployment_id) == "new-model"
137137

138-
def test_pop_model_returns_true_when_present(
138+
def test_clear_model_returns_true_when_present(
139139
self, chat_config: DeploymentChatConfig, deployment_id: UUID
140140
) -> None:
141141
chat_config.set_model(deployment_id, "llama-3-8b")
142-
assert chat_config.pop_model(deployment_id) is True
142+
assert chat_config.clear_model(deployment_id) is True
143143
assert chat_config.get_model(deployment_id) is None
144144

145-
def test_pop_model_returns_false_when_absent(
145+
def test_clear_model_returns_false_when_absent(
146146
self, chat_config: DeploymentChatConfig, deployment_id: UUID
147147
) -> None:
148-
assert chat_config.pop_model(deployment_id) is False
148+
assert chat_config.clear_model(deployment_id) is False
149149

150150
def test_token_and_model_share_one_entry(
151151
self, chat_config: DeploymentChatConfig, deployment_id: UUID
@@ -156,19 +156,19 @@ def test_token_and_model_share_one_entry(
156156
assert entry == DeploymentChatConfigEntry(token="sk-x", model="llama-3-8b")
157157

158158

159-
class TestConfigPop:
160-
def test_pop_removes_whole_entry(
159+
class TestConfigDelete:
160+
def test_delete_removes_whole_entry(
161161
self, chat_config: DeploymentChatConfig, deployment_id: UUID
162162
) -> None:
163163
chat_config.set_token(deployment_id, "sk-x")
164164
chat_config.set_model(deployment_id, "llama-3-8b")
165-
assert chat_config.pop(deployment_id) is True
165+
assert chat_config.delete(deployment_id) is True
166166
assert chat_config.get(deployment_id) is None
167167

168-
def test_pop_returns_false_when_absent(
168+
def test_delete_returns_false_when_absent(
169169
self, chat_config: DeploymentChatConfig, deployment_id: UUID
170170
) -> None:
171-
assert chat_config.pop(deployment_id) is False
171+
assert chat_config.delete(deployment_id) is False
172172

173173

174174
class TestHistoryAppendSlice:

0 commit comments

Comments
 (0)