Source code for r2x_core.utils
"""Utility functions script."""
import inspect
from collections.abc import Callable
from pathlib import Path
from typing import Any
from pydantic import ValidationInfo
from .file_types import EXTENSION_MAPPING
[docs]
def filter_valid_kwargs(func: Callable[..., Any], kwargs: dict[str, Any]) -> dict[str, Any]:
"""Filter kwargs to only include valid parameters for the given function."""
sig = inspect.signature(func)
valid_params = set(sig.parameters.keys())
return {k: v for k, v in kwargs.items() if k in valid_params}
[docs]
def validate_file_extension(path: Path, info: ValidationInfo) -> Path:
"""Validate that the file path has a supported extension.
This is a Pydantic validator that checks if the file extension from the
provided path exists as a key in the module-level `EXTENSION_MAPPING`.
Parameters
----------
value : str
The file path string to validate, provided by Pydantic.
info : pydantic.ValidationInfo
Pydantic's validation context. Required by the validator signature
but not used in this function.
Returns
-------
Path
The original file path string if its extension is valid.
Raises
------
AssertionError
If the input `value` is not a string.
ValueError
If the file path has no extension.
KeyError
If the file's extension is not found in `EXTENSION_MAPPING`.
Notes
-----
This function is intended for use as a Pydantic model validator (e.g.,
with `@field_validator` or `AfterValidator`) and should not be called directly.
"""
assert info is not None, "Pydantic validation context is missing."
assert isinstance(path, Path)
ext = path.suffix.lower()
if ext not in EXTENSION_MAPPING:
msg = f"{ext=} not found on `EXTENSION_MAPPING`. "
msg += "Check spelling of file type or verify it is a supported `FileFormat`."
msg += f"List of supported `FileFormat`: {EXTENSION_MAPPING.keys()}"
raise KeyError(msg)
return path