Skip to content

Commit fcf0e8e

Browse files
iamaeroplaneclaude
andcommitted
refactor(extensions): add public update() method to ExtensionRegistry
Add a proper public API for updating registry metadata while preserving installed_at timestamp, instead of directly mutating internal registry data and calling private _save() method. Changes: - Add ExtensionRegistry.update() method that preserves installed_at - Update enable/disable commands to use registry.update() - Update rollback logic to use registry.update() This decouples the CLI from registry internals and maintains proper encapsulation. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 82dda14 commit fcf0e8e

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/specify_cli/__init__.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2839,8 +2839,7 @@ def extension_update(
28392839

28402840
# Restore registry entry
28412841
if backup_registry_entry:
2842-
manager.registry.data["extensions"][extension_id] = backup_registry_entry
2843-
manager.registry._save()
2842+
manager.registry.update(extension_id, backup_registry_entry)
28442843

28452844
console.print(f" [green]✓[/green] Rollback successful")
28462845
except Exception as rollback_error:
@@ -2895,9 +2894,7 @@ def extension_enable(
28952894
raise typer.Exit(0)
28962895

28972896
metadata["enabled"] = True
2898-
# Update registry directly to preserve installed_at (add() would overwrite it)
2899-
manager.registry.data["extensions"][extension_id] = metadata
2900-
manager.registry._save()
2897+
manager.registry.update(extension_id, metadata)
29012898

29022899
# Enable hooks in extensions.yml
29032900
config = hook_executor.get_project_config()
@@ -2941,9 +2938,7 @@ def extension_disable(
29412938
raise typer.Exit(0)
29422939

29432940
metadata["enabled"] = False
2944-
# Update registry directly to preserve installed_at (add() would overwrite it)
2945-
manager.registry.data["extensions"][extension_id] = metadata
2946-
manager.registry._save()
2941+
manager.registry.update(extension_id, metadata)
29472942

29482943
# Disable hooks in extensions.yml
29492944
config = hook_executor.get_project_config()

src/specify_cli/extensions.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,25 @@ def add(self, extension_id: str, metadata: dict):
228228
}
229229
self._save()
230230

231+
def update(self, extension_id: str, metadata: dict):
232+
"""Update extension metadata in registry, preserving installed_at.
233+
234+
Use this method instead of add() when updating existing extension
235+
metadata (e.g., enabling/disabling) to preserve the original
236+
installation timestamp.
237+
238+
Args:
239+
extension_id: Extension ID
240+
metadata: Extension metadata to update
241+
242+
Raises:
243+
KeyError: If extension is not installed
244+
"""
245+
if extension_id not in self.data["extensions"]:
246+
raise KeyError(f"Extension '{extension_id}' is not installed")
247+
self.data["extensions"][extension_id] = metadata
248+
self._save()
249+
231250
def remove(self, extension_id: str):
232251
"""Remove extension from registry.
233252

0 commit comments

Comments
 (0)