Skip to content

Commit 5ed656e

Browse files
fix: Windows Registry utilities now raise StoreSetupError instead of returning bool
- Changed set_reg_sz_value() to raise StoreSetupError on failure instead of returning False - Changed create_key() to raise StoreSetupError on failure instead of returning False - These functions now follow Python's EAFP philosophy (Easier to Ask for Forgiveness than Permission) - Silent failures are now explicit exceptions with descriptive error messages - Kept delete operations returning bool as deletion can legitimately be a no-op This addresses CodeRabbit's feedback about silent failures in the Windows Registry store. Co-authored-by: William Easton <[email protected]>
1 parent e733fba commit 5ed656e

File tree

2 files changed

+34
-26
lines changed
  • key-value
    • key-value-aio/src/key_value/aio/stores/windows_registry
    • key-value-sync/src/key_value/sync/code_gen/stores/windows_registry

2 files changed

+34
-26
lines changed

key-value/key-value-aio/src/key_value/aio/stores/windows_registry/utils.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import contextlib
22
import winreg
33

4+
from key_value.shared.errors.store import StoreSetupError
5+
46
HiveType = int
57

68

@@ -23,7 +25,7 @@ def get_reg_sz_value(hive: HiveType, sub_key: str, value_name: str) -> str | Non
2325
return None
2426

2527

26-
def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str) -> bool:
28+
def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str) -> None:
2729
"""Set a string value in the Windows Registry.
2830
2931
Args:
@@ -32,15 +34,18 @@ def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str)
3234
value_name: The name of the registry value to set.
3335
value: The string value to write.
3436
35-
Returns:
36-
True if the value was set, False if the key doesn't exist or couldn't be accessed.
37+
Raises:
38+
StoreSetupError: If the registry key doesn't exist or the value couldn't be set.
3739
"""
3840
try:
3941
with winreg.OpenKey(key=hive, sub_key=sub_key, access=winreg.KEY_WRITE) as reg_key:
4042
winreg.SetValueEx(reg_key, value_name, 0, winreg.REG_SZ, value)
41-
return True
42-
except (FileNotFoundError, OSError):
43-
return False
43+
except FileNotFoundError as e:
44+
msg = f"Registry key '{sub_key}' does not exist"
45+
raise StoreSetupError(msg) from e
46+
except OSError as e:
47+
msg = f"Failed to set registry value '{value_name}' at '{sub_key}'"
48+
raise StoreSetupError(msg) from e
4449

4550

4651
def delete_reg_sz_value(hive: HiveType, sub_key: str, value_name: str) -> bool:
@@ -79,22 +84,21 @@ def has_key(hive: HiveType, sub_key: str) -> bool:
7984
return False
8085

8186

82-
def create_key(hive: HiveType, sub_key: str) -> bool:
87+
def create_key(hive: HiveType, sub_key: str) -> None:
8388
"""Create a new registry key.
8489
8590
Args:
8691
hive: The registry hive (e.g., winreg.HKEY_CURRENT_USER).
8792
sub_key: The registry subkey path to create.
8893
89-
Returns:
90-
True if the key was created or already exists, False on error.
94+
Raises:
95+
StoreSetupError: If the registry key couldn't be created.
9196
"""
9297
try:
9398
winreg.CreateKey(hive, sub_key)
94-
except OSError:
95-
return False
96-
else:
97-
return True
99+
except OSError as e:
100+
msg = f"Failed to create registry key '{sub_key}'"
101+
raise StoreSetupError(msg) from e
98102

99103

100104
def delete_key(hive: HiveType, sub_key: str) -> bool:

key-value/key-value-sync/src/key_value/sync/code_gen/stores/windows_registry/utils.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import contextlib
55
import winreg
66

7+
from key_value.shared.errors.store import StoreSetupError
8+
79
HiveType = int
810

911

@@ -26,7 +28,7 @@ def get_reg_sz_value(hive: HiveType, sub_key: str, value_name: str) -> str | Non
2628
return None
2729

2830

29-
def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str) -> bool:
31+
def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str) -> None:
3032
"""Set a string value in the Windows Registry.
3133
3234
Args:
@@ -35,15 +37,18 @@ def set_reg_sz_value(hive: HiveType, sub_key: str, value_name: str, value: str)
3537
value_name: The name of the registry value to set.
3638
value: The string value to write.
3739
38-
Returns:
39-
True if the value was set, False if the key doesn't exist or couldn't be accessed.
40+
Raises:
41+
StoreSetupError: If the registry key doesn't exist or the value couldn't be set.
4042
"""
4143
try:
4244
with winreg.OpenKey(key=hive, sub_key=sub_key, access=winreg.KEY_WRITE) as reg_key:
4345
winreg.SetValueEx(reg_key, value_name, 0, winreg.REG_SZ, value)
44-
return True
45-
except (FileNotFoundError, OSError):
46-
return False
46+
except FileNotFoundError as e:
47+
msg = f"Registry key '{sub_key}' does not exist"
48+
raise StoreSetupError(msg) from e
49+
except OSError as e:
50+
msg = f"Failed to set registry value '{value_name}' at '{sub_key}'"
51+
raise StoreSetupError(msg) from e
4752

4853

4954
def delete_reg_sz_value(hive: HiveType, sub_key: str, value_name: str) -> bool:
@@ -82,22 +87,21 @@ def has_key(hive: HiveType, sub_key: str) -> bool:
8287
return False
8388

8489

85-
def create_key(hive: HiveType, sub_key: str) -> bool:
90+
def create_key(hive: HiveType, sub_key: str) -> None:
8691
"""Create a new registry key.
8792
8893
Args:
8994
hive: The registry hive (e.g., winreg.HKEY_CURRENT_USER).
9095
sub_key: The registry subkey path to create.
9196
92-
Returns:
93-
True if the key was created or already exists, False on error.
97+
Raises:
98+
StoreSetupError: If the registry key couldn't be created.
9499
"""
95100
try:
96101
winreg.CreateKey(hive, sub_key)
97-
except OSError:
98-
return False
99-
else:
100-
return True
102+
except OSError as e:
103+
msg = f"Failed to create registry key '{sub_key}'"
104+
raise StoreSetupError(msg) from e
101105

102106

103107
def delete_key(hive: HiveType, sub_key: str) -> bool:

0 commit comments

Comments
 (0)