MCP Server Neurolorap
by aindreyway
#!/usr/bin/env python3
"""Pre-commit script for running code quality checks."""
import os
import subprocess
import sys
from pathlib import Path
from typing import List, NamedTuple, Tuple
def get_python_path() -> str:
"""Get the path to the Python interpreter from virtual environment."""
venv_path = Path(".venv/bin/python")
if venv_path.exists():
return str(venv_path)
venv_path = Path("venv/bin/python") # alternative venv name
if venv_path.exists():
return str(venv_path)
venv_path = Path(".venv/Scripts/python.exe") # Windows path
if venv_path.exists():
return str(venv_path)
venv_path = Path("venv/Scripts/python.exe") # Windows alternative
if venv_path.exists():
return str(venv_path)
return "python" # fallback to system python if venv not found
class Check(NamedTuple):
"""Represents a pre-commit check with its command and description."""
command: List[str]
description: str
def run_command(command: List[str], description: str) -> Tuple[bool, str]:
"""Run a command and return success status and output."""
print(f"\n{description}...")
try:
# Run with direct output to terminal
result = subprocess.run(
command,
check=False, # Don't raise exception on non-zero exit
env={
**os.environ,
"FORCE_COLOR": "1", # Force colored output
"PY_COLORS": "1",
"MYPY_FORCE_COLOR": "1",
"PYTEST_FORCE_COLOR": "1",
},
)
return result.returncode == 0, ""
except Exception as e:
return False, f"Failed to run command: {e}"
def main() -> int:
"""Run all pre-commit checks."""
python_path = get_python_path()
checks: List[Check] = [
Check(
command=[
python_path,
"-m",
"pytest",
"-v",
"--cov=mcp_server_neurolorap",
"--cov-report=term-missing",
],
description="Running tests with coverage",
),
Check(
command=[python_path, "-m", "black", "."],
description="Formatting code with black",
),
Check(
command=[python_path, "-m", "isort", "."],
description="Sorting imports with isort",
),
Check(
command=[python_path, "-m", "flake8", "."],
description="Checking code style with flake8",
),
Check(
command=[
python_path,
"-m",
"mypy",
"src/mcp_server_neurolorap",
"tests",
],
description="Checking types with mypy",
),
]
failed_checks: List[Tuple[str, str]] = []
any_formatted: bool = False
for check in checks:
success, error = run_command(check.command, check.description)
if not success:
if check.description in [
"Formatting code with black",
"Sorting imports with isort",
]:
# Tools like black return 1 if they modified files
any_formatted = True
else:
failed_checks.append((check.description, error))
if any_formatted:
print("\n⚠️ Some files were reformatted.")
print("Please review and stage the changes.")
return 1
if failed_checks:
print("\n❌ Some checks failed:")
for description, error in failed_checks:
if error: # Only print if there's an error message
print(f"\n{description}:")
print(error)
return 1
print("\n✨ All checks passed successfully! ✨")
print("You can now commit and push your changes.")
return 0
if __name__ == "__main__":
sys.exit(main())