1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
|
SHELL := /bin/bash
# =============================================================================
# Configuration and Environment Variables
# =============================================================================
.DEFAULT_GOAL:=help
.ONESHELL:
.EXPORT_ALL_VARIABLES:
MAKEFLAGS += --no-print-directory
# -----------------------------------------------------------------------------
# Display Formatting and Colors
# -----------------------------------------------------------------------------
BLUE := $(shell printf "\033[1;34m")
GREEN := $(shell printf "\033[1;32m")
RED := $(shell printf "\033[1;31m")
YELLOW := $(shell printf "\033[1;33m")
NC := $(shell printf "\033[0m")
INFO := $(shell printf "$(BLUE)โน$(NC)")
OK := $(shell printf "$(GREEN)โ$(NC)")
WARN := $(shell printf "$(YELLOW)โ $(NC)")
ERROR := $(shell printf "$(RED)โ$(NC)")
# =============================================================================
# Help and Documentation
# =============================================================================
.PHONY: help
help: ## Display this help text for Makefile
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
# =============================================================================
# Installation and Environment Setup
# =============================================================================
.PHONY: install-uv
install-uv: ## Install latest version of uv
@echo "${INFO} Installing uv..."
@curl -LsSf https://astral.sh/uv/install.sh | sh >/dev/null 2>&1
@uv tool install nodeenv >/dev/null 2>&1
@echo "${OK} UV installed successfully"
.PHONY: install
install: destroy clean ## Install the project, dependencies, and pre-commit
@echo "${INFO} Starting fresh installation..."
@uv python pin 3.9 >/dev/null 2>&1
@uv venv >/dev/null 2>&1
@uv sync --all-extras --dev
@echo "${OK} Installation complete! ๐"
.PHONY: destroy
destroy: ## Destroy the virtual environment
@echo "${INFO} Destroying virtual environment... ๐๏ธ"
@rm -rf .venv
@echo "${OK} Virtual environment destroyed ๐๏ธ"
# =============================================================================
# Dependency Management
# =============================================================================
.PHONY: upgrade
upgrade: ## Upgrade all dependencies to latest stable versions
@echo "${INFO} Updating all dependencies... ๐"
@uv lock --upgrade
@echo "${OK} Dependencies updated ๐"
@uv run pre-commit autoupdate
@echo "${OK} Updated Pre-commit hooks ๐"
.PHONY: lock
lock: ## Rebuild lockfiles from scratch
@echo "${INFO} Rebuilding lockfiles... ๐"
@uv lock --upgrade >/dev/null 2>&1
@echo "${OK} Lockfiles updated"
# =============================================================================
# Build and Release
# =============================================================================
.PHONY: build
build: ## Build the package
@echo "${INFO} Building package... ๐ฆ"
@uv build >/dev/null 2>&1
@echo "${OK} Package build complete"
.PHONY: release
release: ## Bump version and create release tag
@echo "${INFO} Preparing for release... ๐ฆ"
@make docs
@make clean
@make build
@uv run bump-my-version bump $(bump)
@uv lock --upgrade-package advanced-alchemy
@echo "${OK} Release complete ๐"
# =============================================================================
# Cleaning and Maintenance
# =============================================================================
.PHONY: clean
clean: ## Cleanup temporary build artifacts
@echo "${INFO} Cleaning working directory... ๐งน"
@rm -rf .pytest_cache .ruff_cache .hypothesis build/ dist/ .eggs/ .coverage coverage.xml coverage.json htmlcov/ .pytest_cache tests/.pytest_cache tests/**/.pytest_cache .mypy_cache .unasyncd_cache/ .auto_pytabs_cache node_modules >/dev/null 2>&1
@find . -name '*.egg-info' -exec rm -rf {} + >/dev/null 2>&1
@find . -type f -name '*.egg' -exec rm -f {} + >/dev/null 2>&1
@find . -name '*.pyc' -exec rm -f {} + >/dev/null 2>&1
@find . -name '*.pyo' -exec rm -f {} + >/dev/null 2>&1
@find . -name '*~' -exec rm -f {} + >/dev/null 2>&1
@find . -name '__pycache__' -exec rm -rf {} + >/dev/null 2>&1
@find . -name '.ipynb_checkpoints' -exec rm -rf {} + >/dev/null 2>&1
@echo "${OK} Working directory cleaned"
$(MAKE) docs-clean
# =============================================================================
# Testing and Quality Checks
# =============================================================================
.PHONY: test
test: ## Run the tests
@echo "${INFO} Running test cases... ๐งช"
@uv run pytest -n 2 --quiet
@echo "${OK} Tests passed โจ"
.PHONY: coverage
coverage: ## Run tests with coverage report
@echo "${INFO} Running tests with coverage... ๐"
@uv run pytest --cov -n auto --quiet
@uv run coverage html >/dev/null 2>&1
@uv run coverage xml >/dev/null 2>&1
@echo "${OK} Coverage report generated โจ"
# -----------------------------------------------------------------------------
# Type Checking
# -----------------------------------------------------------------------------
.PHONY: mypy
mypy: ## Run mypy
@echo "${INFO} Running mypy... ๐"
@uv run dmypy run
@echo "${OK} Mypy checks passed โจ"
.PHONY: mypy-nocache
mypy-nocache: ## Run Mypy without cache
@echo "${INFO} Running mypy without cache... ๐"
@uv run mypy
@echo "${OK} Mypy checks passed โจ"
.PHONY: pyright
pyright: ## Run pyright
@echo "${INFO} Running pyright... ๐"
@uv run pyright
@echo "${OK} Pyright checks passed โจ"
.PHONY: type-check
type-check: mypy pyright ## Run all type checking
# -----------------------------------------------------------------------------
# Linting and Formatting
# -----------------------------------------------------------------------------
.PHONY: pre-commit
pre-commit: ## Run pre-commit hooks
@echo "${INFO} Running pre-commit checks... ๐"
@NODE_OPTIONS="--no-deprecation --disable-warning=ExperimentalWarning" uv run pre-commit run --color=always --all-files
@echo "${OK} Pre-commit checks passed โจ"
.PHONY: slotscheck
slotscheck: ## Run slotscheck
@echo "${INFO} Running slots check... ๐"
@uv run slotscheck
@echo "${OK} Slots check passed โจ"
.PHONY: fix
fix: ## Run code formatters
@echo "${INFO} Running code formatters... ๐ง"
@uv run ruff check --fix --unsafe-fixes
@echo "${OK} Code formatting complete โจ"
.PHONY: lint
lint: pre-commit type-check slotscheck ## Run all linting checks
.PHONY: check-all
check-all: lint test coverage ## Run all checks (lint, test, coverage)
# =============================================================================
# Documentation
# =============================================================================
.PHONY: docs-clean
docs-clean: ## Clean documentation build
@echo "${INFO} Cleaning documentation build assets... ๐งน"
@rm -rf docs/_build >/dev/null 2>&1
@echo "${OK} Documentation assets cleaned"
.PHONY: docs-serve
docs-serve: ## Serve documentation locally
@echo "${INFO} Starting documentation server... ๐"
@uv run sphinx-autobuild docs docs/_build/ -j auto --watch advanced_alchemy --watch docs --watch tests --watch CONTRIBUTING.rst --open-browser
.PHONY: docs
docs: docs-clean ## Build documentation
@echo "${INFO} Building documentation... ๐"
@uv run sphinx-build -M html docs docs/_build/ -E -a -j auto -W --keep-going
@echo "${OK} Documentation built successfully"
.PHONY: docs-linkcheck
docs-linkcheck: ## Check documentation links
@echo "${INFO} Checking documentation links... ๐"
@uv run sphinx-build -b linkcheck ./docs ./docs/_build -D linkcheck_ignore='http://.*','https://.*'
@echo "${OK} Link check complete"
.PHONY: docs-linkcheck-full
docs-linkcheck-full: ## Run full documentation link check
@echo "${INFO} Running full link check... ๐"
@uv run sphinx-build -b linkcheck ./docs ./docs/_build -D linkcheck_anchors=0
@echo "${OK} Full link check complete"
|