#!/usr/bin/env python3
"""Clean up generated files and directories.
This script provides cross-platform compatibility for the make clean command.
"""
import os
import shutil
from pathlib import Path
def remove_path(path: Path, description: str = None) -> bool:
"""Remove a file or directory safely."""
try:
if path.exists():
if path.is_file():
path.unlink()
if description:
print(f" Removed file: {description}")
return True
elif path.is_dir():
shutil.rmtree(path)
if description:
print(f" Removed directory: {description}")
return True
return False
except OSError as e:
print(f" Warning: Could not remove {path}: {e}")
return False
def remove_pattern(root_dir: Path, pattern: str, description: str = None) -> int:
"""Remove files/directories matching a pattern."""
count = 0
try:
for path in root_dir.rglob(pattern):
if remove_path(path):
count += 1
if count > 0 and description:
print(f" Removed {count} {description}")
except OSError as e:
print(f" Warning: Error processing pattern {pattern}: {e}")
return count
def main():
"""Clean up generated files and directories."""
print("Cleaning up generated files...")
# Get the project root directory
script_dir = Path(__file__).parent
project_root = script_dir.parent
# Change to project root
os.chdir(project_root)
# Remove build directories
build_dirs = ["build", "dist", ".pytest_cache", "htmlcov", ".mypy_cache"]
for dir_name in build_dirs:
remove_path(Path(dir_name), dir_name)
# Remove coverage files
remove_path(Path(".coverage"), ".coverage")
remove_path(Path("coverage.xml"), "coverage.xml")
# Remove root-level build artifacts
for whl_file in Path(".").glob("*.whl"):
remove_path(whl_file, f"wheel file: {whl_file.name}")
for tar_file in Path(".").glob("*.tar.gz"):
remove_path(tar_file, f"tarball: {tar_file.name}")
# Remove egg-info directories
remove_pattern(Path("."), "*.egg-info", "egg-info directories")
# Remove __pycache__ directories
remove_pattern(Path("."), "__pycache__", "__pycache__ directories")
# Remove .pyc files
remove_pattern(Path("."), "*.pyc", ".pyc files")
print("Clean completed.")
if __name__ == "__main__":
main()