HASHIRU / utils /paths.py
mulambo's picture
Initial commit
fea1bd1
# -*- coding: utf-8 -*-
"""
Path and filesystem related utilities.
"""
from pathlib import Path
from typing import Any, Union
def to_path(obj: Any) -> Path:
"""Converts a string or Path object to a resolved Path."""
if isinstance(obj, Path):
return obj.resolve(strict=False)
if isinstance(obj, str):
return Path(obj).resolve(strict=False)
raise TypeError(f"Object of type {type(obj).__name__} cannot be converted to Path")
def is_binary_file(path: Union[str, Path], chunk_size: int = 1024) -> bool:
"""
Heuristically determines if a file is binary by checking for null bytes.
Returns True on read errors (assume not plain text).
"""
try:
file_path = to_path(path)
if not file_path.is_file():
return True
with file_path.open("rb") as f:
chunk = f.read(chunk_size)
return b"\x00" in chunk
except Exception:
return True
def safe_glob(base: Union[str, Path], pattern: str) -> list[Path]:
"""
Performs a glob search relative to a base path, handling exceptions.
Returns a list of resolved Path objects.
"""
try:
base_path = to_path(base)
if not base_path.is_dir():
return []
results = base_path.rglob(pattern) if "**" in pattern else base_path.glob(pattern)
return [p.resolve(strict=False) for p in results if p.exists()]
except Exception:
return []