From a66245c079ab5b5f5d6eec729190564ea063e4c2 Mon Sep 17 00:00:00 2001 From: Quratulain-bilal Date: Wed, 29 Jul 2026 13:17:07 +0500 Subject: [PATCH 1/2] fix: narrow bare except Exception in VS Code settings merge Replace overly broad except Exception with (OSError, ValueError, KeyError) to let programming errors like TypeError or AttributeError propagate while still handling expected I/O and parse errors gracefully. --- src/specify_cli/_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/specify_cli/_utils.py b/src/specify_cli/_utils.py index 85b659d67b..704ce93de3 100644 --- a/src/specify_cli/_utils.py +++ b/src/specify_cli/_utils.py @@ -213,7 +213,7 @@ def atomic_write_json(target_file: Path, payload: dict[str, Any]) -> None: shutil.copy2(sub_item, dest_file) log("Copied (no existing settings.json):", "blue") - except Exception as e: + except (OSError, ValueError, KeyError) as e: log(f"Warning: Could not merge settings: {e}", "yellow") if not dest_file.exists(): shutil.copy2(sub_item, dest_file) From 27f4d1fbf5f44b7d903199f8b1d66357ae54e3b7 Mon Sep 17 00:00:00 2001 From: Quratulain-bilal Date: Fri, 31 Jul 2026 20:07:05 +0500 Subject: [PATCH 2/2] test: verify programming errors propagate through handle_vscode_settings The narrow exception change from 'except Exception' to 'except (OSError, ValueError, KeyError)' was not covered by a regression test. Add a test that monkeypatches merge_json_files to raise TypeError and verifies it propagates rather than being swallowed. --- tests/test_merge.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/test_merge.py b/tests/test_merge.py index 07cc468842..6b1eb1c2fc 100644 --- a/tests/test_merge.py +++ b/tests/test_merge.py @@ -1,5 +1,7 @@ import stat +import pytest + from specify_cli import merge_json_files from specify_cli import handle_vscode_settings @@ -188,3 +190,25 @@ def test_handle_vscode_settings_preserves_mode_on_atomic_write(tmp_path): after_mode = stat.S_IMODE(dest_file.stat().st_mode) assert after_mode == before_mode + + +def test_handle_vscode_settings_propagates_programming_errors(tmp_path): + """Unexpected programming errors (TypeError) must propagate, not be silently swallowed.""" + vscode_dir = tmp_path / ".vscode" + vscode_dir.mkdir() + dest_file = vscode_dir / "settings.json" + dest_file.write_text('{"a": 1}\n', encoding="utf-8") + template_file = tmp_path / "template_settings.json" + template_file.write_text('{"b": 2}\n', encoding="utf-8") + + import specify_cli._utils as utils_mod + original_merge = utils_mod.merge_json_files + utils_mod.merge_json_files = lambda *a, **kw: (_ for _ in ()).throw(TypeError("boom")) + try: + with pytest.raises(TypeError): + handle_vscode_settings( + template_file, dest_file, "settings.json", + verbose=False, tracker=None, + ) + finally: + utils_mod.merge_json_files = original_merge