diff --git a/src/namecheap/_api/base.py b/src/namecheap/_api/base.py index 11a5f04..bd05397 100644 --- a/src/namecheap/_api/base.py +++ b/src/namecheap/_api/base.py @@ -99,6 +99,18 @@ def normalize_xml_response(data: dict[str, Any]) -> dict[str, Any]: return normalized +def navigate_path(result: Any, path: str) -> Any: + """Walk a dot-separated path into a parsed XML response. + + A self-closing element (e.g. ```` returned for an + account with no domains) is parsed as None, so navigating through it must + not raise; treat a None segment as an empty result. + """ + for key in path.split("."): + result = (result or {}).get(key, {}) + return result + + class BaseAPI: """Base class for API endpoints.""" @@ -175,8 +187,7 @@ def _request( # Navigate to specific path if provided if path: - for key in path.split("."): - result = result.get(key, {}) + result = navigate_path(result, path) # Return empty list if no results if not result: diff --git a/src/namecheap/_api/base_check.py b/src/namecheap/_api/base_check.py new file mode 100644 index 0000000..849a081 --- /dev/null +++ b/src/namecheap/_api/base_check.py @@ -0,0 +1,27 @@ +"""Boundary checks for namecheap._api.base. Run: uv run python -m namecheap._api.base_check""" + +from namecheap._api.base import navigate_path + + +def check_navigate_path_reaches_value() -> None: + data = {"DomainGetListResult": {"Domain": [{"@Name": "example.com"}]}} + assert navigate_path(data, "DomainGetListResult.Domain") == [ + {"@Name": "example.com"} + ] + + +def check_navigate_path_missing_key_returns_empty() -> None: + assert navigate_path({}, "DomainGetListResult.Domain") == {} + + +def check_navigate_path_none_segment_returns_empty() -> None: + # Empty account: is parsed as None by xmltodict. + data = {"DomainGetListResult": None, "Paging": {"TotalItems": "0"}} + assert navigate_path(data, "DomainGetListResult.Domain") == {} + + +if __name__ == "__main__": + check_navigate_path_reaches_value() + check_navigate_path_missing_key_returns_empty() + check_navigate_path_none_segment_returns_empty() + print("ok: namecheap._api.base")