From 93a590cdc5b8b250d717af3e415f6420e32156e0 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Tue, 17 Mar 2026 23:30:55 -0400 Subject: [PATCH] feat(backend): Implement storage functions for context presets --- src/project_manager.py | 22 +++++++++++++ tests/test_context_presets.py | 59 +++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 tests/test_context_presets.py diff --git a/src/project_manager.py b/src/project_manager.py index 277d889..e7c0960 100644 --- a/src/project_manager.py +++ b/src/project_manager.py @@ -101,6 +101,7 @@ def default_project(name: str = "unnamed") -> dict[str, Any]: "output": {"output_dir": "./md_gen"}, "files": {"base_dir": ".", "paths": [], "tier_assignments": {}}, "screenshots": {"base_dir": ".", "paths": []}, + "context_presets": {}, "gemini_cli": {"binary_path": "gemini"}, "deepseek": {"reasoning_effort": "medium"}, "agent": { @@ -248,6 +249,27 @@ def flat_config(proj: dict[str, Any], disc_name: Optional[str] = None, track_id: "history": history, }, } + # ── context presets ────────────────────────────────────────────────────────── + +def save_context_preset(project_dict: dict, preset_name: str, files: list[str], screenshots: list[str]) -> None: + """Save a named context preset (files + screenshots) into the project dict.""" + if "context_presets" not in project_dict: + project_dict["context_presets"] = {} + project_dict["context_presets"][preset_name] = { + "files": files, + "screenshots": screenshots + } + +def load_context_preset(project_dict: dict, preset_name: str) -> dict: + """Return the files and screenshots for a named preset.""" + if "context_presets" not in project_dict or preset_name not in project_dict["context_presets"]: + raise KeyError(f"Preset '{preset_name}' not found in project context_presets.") + return project_dict["context_presets"][preset_name] + +def delete_context_preset(project_dict: dict, preset_name: str) -> None: + """Remove a named preset if it exists.""" + if "context_presets" in project_dict: + project_dict["context_presets"].pop(preset_name, None) # ── track state persistence ───────────────────────────────────────────────── def save_track_state(track_id: str, state: 'TrackState', base_dir: Union[str, Path] = ".") -> None: diff --git a/tests/test_context_presets.py b/tests/test_context_presets.py new file mode 100644 index 0000000..23bdbb6 --- /dev/null +++ b/tests/test_context_presets.py @@ -0,0 +1,59 @@ +import pytest +from src.project_manager import ( + save_context_preset, + load_context_preset, + delete_context_preset +) + +def test_save_context_preset(): + project_dict = {} + preset_name = "test_preset" + files = ["file1.py", "file2.py"] + screenshots = ["screenshot1.png"] + + save_context_preset(project_dict, preset_name, files, screenshots) + + assert "context_presets" in project_dict + assert preset_name in project_dict["context_presets"] + assert project_dict["context_presets"][preset_name]["files"] == files + assert project_dict["context_presets"][preset_name]["screenshots"] == screenshots + +def test_load_context_preset(): + project_dict = { + "context_presets": { + "test_preset": { + "files": ["file1.py"], + "screenshots": ["screenshot1.png"] + } + } + } + + preset = load_context_preset(project_dict, "test_preset") + + assert preset["files"] == ["file1.py"] + assert preset["screenshots"] == ["screenshot1.png"] + +def test_load_nonexistent_preset(): + project_dict = {"context_presets": {}} + with pytest.raises(KeyError): + load_context_preset(project_dict, "nonexistent") + +def test_delete_context_preset(): + project_dict = { + "context_presets": { + "test_preset": { + "files": ["file1.py"], + "screenshots": [] + } + } + } + + delete_context_preset(project_dict, "test_preset") + + assert "test_preset" not in project_dict["context_presets"] + +def test_delete_nonexistent_preset_no_error(): + project_dict = {"context_presets": {}} + # Should not raise error if it doesn't exist + delete_context_preset(project_dict, "nonexistent") + assert "nonexistent" not in project_dict["context_presets"]