# Supported Python versions PYTHON_VERSIONS = 3.10 3.11 3.12 3.13 3.14 DEFAULT_PYTHON = 3.10 # Install dependencies .PHONY: install install: @uv sync @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Install dev dependencies .PHONY: install-dev install-dev: @uv sync --extra dev @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Update dependencies .PHONY: lock lock: @uv lock @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Upgrade dependencies .PHONY: upgrade upgrade: @uv lock --upgrade @uv sync --all-extras @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Stop .PHONY: stop stop: @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Restart .PHONY: restart restart: stop start-example # Lint code .PHONY: lint lint: @COMPOSE_BAKE=true docker compose run --rm --no-deps roboco sh -c "echo 'Formatting w/ Ruff...' ; echo '' ; ruff format . ; echo '' ; echo '' ; echo 'Linting w/ Ruff...' ; echo '' ; ruff check . ; echo '' ; echo '' ; echo 'Type checking w/ Mypy...' ; echo '' ; mypy . ; echo '' ; echo '' ; echo 'Finding dead code w/ Vulture...' ; echo '' ; vulture" @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Fix code .PHONY: fix fix: @echo "Fixing formatting w/ Ruff..." @echo '' @uv run ruff check --fix . @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Find dead code with Vulture .PHONY: vulture vulture: @echo "Finding dead code with Vulture..." @echo '' # @uv run vulture # @uv run vulture --verbose @uv run vulture vulture_whitelist.py @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Security scan with Bandit .PHONY: bandit bandit: @echo "Running Bandit security scan..." @echo '' @uv run bandit -r guard -ll @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Check dependencies with Safety .PHONY: safety safety: @echo "Checking dependencies with Safety..." @echo '' @uv run safety scan @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Audit dependencies with pip-audit .PHONY: pip-audit pip-audit: @echo "Auditing dependencies with pip-audit..." @echo '' @uv run pip-audit @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Analyze code complexity with Radon .PHONY: radon radon: @echo "Analyzing code complexity with Radon..." @echo '' @echo "Cyclomatic Complexity:" @uv run radon cc guard -nc @echo '' @echo "Maintainability Index:" @uv run radon mi guard -nc @echo '' @echo "Raw Metrics:" @uv run radon raw guard @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Check complexity thresholds with Xenon .PHONY: xenon xenon: @echo "Checking complexity thresholds with Xenon..." @echo '' @uv run xenon guard --max-absolute B --max-modules A --max-average A @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Analyze dependencies with Deptry .PHONY: deptry deptry: @echo "Analyzing dependencies with Deptry..." @echo '' @uv run deptry . @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Static analysis with Semgrep .PHONY: semgrep semgrep: @echo "Running Semgrep static analysis..." @echo '' @uv run semgrep --config=auto guard @find . | grep -E "(__pycache__|\.pyc|\.pyo|\.pytest_cache|\.ruff_cache|\.mypy_cache)" | xargs rm -rf # Run all security checks .PHONY: security security: bandit safety pip-audit @echo "All security checks completed." # Run all code quality checks .PHONY: quality quality: lint vulture radon xenon @echo "All code quality checks completed." # Run all analysis tools .PHONY: analysis analysis: deptry semgrep @echo "All analysis tools completed." # Run all checks (linting, security, quality, and analysis) .PHONY: check-all check-all: lint security quality analysis @echo "All checks completed." # Run tests (default Python version) .PHONY: test test: @COMPOSE_BAKE=true PYTHON_VERSION=$(DEFAULT_PYTHON) docker compose run --rm --build roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Run All Python versions .PHONY: test-all test-all: test-3.10 test-3.11 test-3.12 test-3.13 test-3.14 # Python 3.10 .PHONY: test-3.10 test-3.10: @docker compose down -v roboco @COMPOSE_BAKE=true PYTHON_VERSION=3.10 docker compose build roboco @PYTHON_VERSION=3.10 docker compose run --rm roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Python 3.11 .PHONY: test-3.11 test-3.11: @docker compose down -v roboco @COMPOSE_BAKE=true PYTHON_VERSION=3.11 docker compose build roboco @PYTHON_VERSION=3.11 docker compose run --rm roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Python 3.12 .PHONY: test-3.12 test-3.12: @docker compose down -v roboco @COMPOSE_BAKE=true PYTHON_VERSION=3.12 docker compose build roboco @PYTHON_VERSION=3.12 docker compose run --rm roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Python 3.13 .PHONY: test-3.13 test-3.13: @docker compose down -v roboco @COMPOSE_BAKE=true PYTHON_VERSION=3.13 docker compose build roboco @PYTHON_VERSION=3.13 docker compose run --rm roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Python 3.14 .PHONY: test-3.14 test-3.14: @docker compose down -v roboco @COMPOSE_BAKE=true PYTHON_VERSION=3.14 docker compose build roboco @PYTHON_VERSION=3.14 docker compose run --rm roboco pytest -v --cov=. @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Stress Test .PHONY: stress-test stress-test: @COMPOSE_BAKE=true docker compose up --build -d roboco-example redis @echo "Waiting for services to start up..." @sleep 5 @docker compose run --rm roboco-example uv run python examples/testing/stress_test.py --url http://roboco-example:8000 --duration 120 --concurrency 50 --ramp-up 10 --delay 0.02 --test-type standard -v @docker compose down --rmi all --remove-orphans -v @docker system prune -f # High-load stress test .PHONY: high-load-stress-test high-load-stress-test: @COMPOSE_BAKE=true docker compose up --build -d roboco-example redis @echo "Waiting for services to start up..." @sleep 5 @docker compose run --rm roboco-example uv run python examples/testing/stress_test.py --url http://roboco-example:8000 --duration 180 --concurrency 100 --ramp-up 15 --delay 0.01 --test-type high_load -v @docker compose down --rmi all --remove-orphans -v @docker system prune -f # Serve docs .PHONY: serve-docs serve-docs: @uv run mkdocs serve @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Lint documentation .PHONY: lint-docs lint-docs: @uv run pymarkdownlnt scan -r -e ./.venv -e ./.git -e ./.github -e ./data -e ./guard -e ./tests -e ./.claude -e ./CLAUDE.md -e ./.cursor -e ./.kiro -e ./ZZZ . @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Fix documentation .PHONY: fix-docs fix-docs: @uv run pymarkdownlnt fix -r -e ./.venv -e ./.git -e ./.github -e ./data -e ./guard -e ./tests -e ./.claude -e ./CLAUDE.md -e ./.cursor -e ./.kiro -e ./ZZZ . @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Prune .PHONY: prune prune: @docker system prune -f # Clean Cache Files .PHONY: clean clean: @find . | grep -E "(__pycache__|\\.pyc|\\.pyo|\\.pytest_cache|\\.ruff_cache|\\.mypy_cache)" | xargs rm -rf # Help .PHONY: help help: @echo "Available commands:" @echo " make install - Install dependencies" @echo " make install-dev - Install dev dependencies" @echo " make lock - Update dependencies" @echo " make start-example - Start example application with docker compose" @echo " make run-example - Build and run example container directly" @echo " make stop - Stop all containers and clean up resources" @echo " make restart - Restart example application" @echo " make lint - Run linting checks" @echo " make fix - Auto-fix linting issues" @echo " make vulture - Find dead code with Vulture" @echo " make bandit - Run Bandit security scan" @echo " make safety - Check dependencies with Safety" @echo " make pip-audit - Audit dependencies with pip-audit" @echo " make radon - Analyze code complexity with Radon" @echo " make xenon - Check complexity thresholds with Xenon" @echo " make deptry - Analyze dependencies with Deptry" @echo " make semgrep - Run Semgrep static analysis" @echo " make security - Run all security checks" @echo " make quality - Run all code quality checks" @echo " make analysis - Run all analysis tools" @echo " make check-all - Run all checks (lint, security, quality, analysis)" @echo " make test - Run tests with Python $(DEFAULT_PYTHON)" @echo " make test-all - Run tests with all Python versions ($(PYTHON_VERSIONS))" @echo " make test- - Run tests with specific Python version (e.g., make test-3.10)" @echo " make local-test - Run tests locally" @echo " make stress-test - Run stress test" @echo " make high-load-stress-test - Run high-load stress test" @echo " make serve-docs - Serve documentation" @echo " make lint-docs - Run markdownlint on documentation" @echo " make fix-docs - Auto-fix markdownlint issues" @echo " make prune - Prune docker resources" @echo " make clean - Clean cache files" @echo " make help - Show this help message" @echo " make show-python-versions - Show supported Python versions" # Python versions list .PHONY: show-python-versions show-python-versions: @echo "Supported Python versions: $(PYTHON_VERSIONS)" @echo "Default Python version: $(DEFAULT_PYTHON)"