Skip to content

Commit 225164b

Browse files
fix: correct validation logic in _validate_pref_value method
1 parent c8731eb commit 225164b

File tree

1 file changed

+18
-29
lines changed

1 file changed

+18
-29
lines changed

pydoll/browser/options.py

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
ArgumentAlreadyExistsInOptions,
99
ArgumentNotFoundInOptions,
1010
InvalidPreferencePath,
11-
InvalidPreferenceValue,
1211
WrongPrefsDict,
1312
)
1413

@@ -152,7 +151,12 @@ def _set_pref_path(self, path: list, value):
152151
# validation will be handled in the updated implementation below
153152
# (kept for backward-compatibility if callers rely on signature)
154153
self._validate_pref_path(path)
155-
self._validate_pref_value(path, value)
154+
node = PREFERENCE_SCHEMA
155+
for key in path[:-1]:
156+
node = node[key]
157+
final_key = path[-1]
158+
expected = node[final_key]
159+
self._validate_pref_value(path, value, expected)
156160

157161
d = cast(dict[str, Any], self._browser_preferences)
158162
for key in path[:-1]:
@@ -172,40 +176,25 @@ def _validate_pref_path(path: list[str]) -> None:
172176
else:
173177
raise InvalidPreferencePath(f'Invalid preference path: {".".join(path)}')
174178

175-
@staticmethod
176-
def _validate_pref_value(path: list[str], value: Any) -> None:
179+
def _validate_pref_value(self, path: list[str], value: Any, expected: Any) -> None:
177180
"""
178181
Validate the value type for the final segment in path against PREFERENCE_SCHEMA.
179182
Supports recursive validation for nested dictionaries.
180183
Raises InvalidPreferenceValue or InvalidPreferencePath on validation failure.
181184
"""
182-
node = PREFERENCE_SCHEMA
183-
# Walk to the parent node (assumes path is valid from _validate_pref_path)
184-
for key in path[:-1]:
185-
node = node[key]
186-
187-
final_key = path[-1]
188-
expected = node[final_key]
189-
190185
if isinstance(expected, dict):
191-
# Expected is a subschema dict; value must be a dict and match the schema
192186
if not isinstance(value, dict):
193-
raise InvalidPreferenceValue(
194-
f'Invalid value type for {".".join(path)}: '
195-
f'expected dict, got {type(value).__name__}'
196-
)
197-
# Recursively validate each key-value in the value dict
198-
for k, v in value.items():
199-
if k not in expected:
200-
raise InvalidPreferencePath(
201-
f'Invalid key "{k}" in preference path {".".join(path)}'
202-
)
203-
ChromiumOptions._validate_pref_value(path + [k], v)
204-
elif not isinstance(value, expected):
205-
# Expected is a primitive type; check isinstance
206-
raise InvalidPreferenceValue(
207-
f'Invalid value type for {".".join(path)}: '
208-
f'expected {expected.__name__}, got {type(value).__name__}'
187+
raise TypeError(f"Expected dict for preference path {'.'.join(path)}")
188+
for subkey, subval in value.items():
189+
if subkey not in expected:
190+
raise KeyError(f"Invalid preference key: {'.'.join(path)}.{subkey}")
191+
self._validate_pref_value([*path, subkey], subval, expected[subkey])
192+
return
193+
194+
if not isinstance(value, expected):
195+
raise TypeError(
196+
f"Invalid type at {'.'.join(path)}: "
197+
f"expected {expected.__name__}, got {type(value).__name__}"
209198
)
210199

211200
def _get_pref_path(self, path: list):

0 commit comments

Comments
 (0)