Add diff and utils modules
This commit is contained in:
67
i18n_guardian/utils/file_utils.py
Normal file
67
i18n_guardian/utils/file_utils.py
Normal file
@@ -0,0 +1,67 @@
|
||||
"""File utilities."""
|
||||
|
||||
from pathlib import Path
|
||||
from typing import List, Optional
|
||||
|
||||
|
||||
def read_file_safe(path: Path, encoding: str = "utf-8") -> Optional[str]:
|
||||
"""Safely read a file, returning None on error."""
|
||||
try:
|
||||
return path.read_text(encoding=encoding)
|
||||
except (OSError, UnicodeDecodeError):
|
||||
return None
|
||||
|
||||
|
||||
def find_translation_files(
|
||||
path: Path,
|
||||
patterns: Optional[List[str]] = None,
|
||||
) -> List[Path]:
|
||||
"""Find translation files in a directory."""
|
||||
patterns = patterns or [
|
||||
"**/*.json",
|
||||
"**/*.po",
|
||||
"**/*.pot",
|
||||
"**/*.yaml",
|
||||
"**/*.yml",
|
||||
]
|
||||
|
||||
files = []
|
||||
for pattern in patterns:
|
||||
files.extend(path.rglob(pattern))
|
||||
|
||||
return sorted(set(files))
|
||||
|
||||
|
||||
def is_text_file(path: Path, chunk_size: int = 8192) -> bool:
|
||||
"""Check if a file is a text file."""
|
||||
try:
|
||||
with open(path, "rb") as f:
|
||||
chunk = f.read(chunk_size)
|
||||
if b"\x00" in chunk:
|
||||
return False
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
|
||||
def backup_file(path: Path) -> Path:
|
||||
"""Create a backup of a file."""
|
||||
backup_path = path.with_suffix(path.suffix + ".bak")
|
||||
if backup_path.exists():
|
||||
counter = 1
|
||||
while backup_path.exists():
|
||||
backup_path = path.with_suffix(f"{path.suffix}.bak{counter}")
|
||||
counter += 1
|
||||
|
||||
backup_path.write_bytes(path.read_bytes())
|
||||
return backup_path
|
||||
|
||||
|
||||
def restore_backup(backup_path: Path, original_path: Path) -> bool:
|
||||
"""Restore a file from backup."""
|
||||
try:
|
||||
original_path.write_bytes(backup_path.read_bytes())
|
||||
backup_path.unlink()
|
||||
return True
|
||||
except OSError:
|
||||
return False
|
||||
Reference in New Issue
Block a user