-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy pathMakefile
157 lines (126 loc) · 5.73 KB
/
Makefile
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
.PHONY: clean deepclean install dev prerequisites mypy ruff ruff-format pyproject-fmt codespell lint pre-commit test-run test build publish doc-watch doc-build doc-coverage doc
########################################################################################
# Variables
########################################################################################
# Documentation target directory, will be adapted to specific folder for readthedocs.
PUBLIC_DIR := $(shell [ "$$READTHEDOCS" = "True" ] && echo "$${READTHEDOCS_OUTPUT}html" || echo "public")
# Determine the Python version used by pipx.
PIPX_PYTHON_VERSION := $(shell `pipx environment --value PIPX_DEFAULT_PYTHON` -c "from sys import version_info; print(f'{version_info.major}.{version_info.minor}')")
########################################################################################
# Development Environment Management
########################################################################################
# Remove common intermediate files.
clean:
-rm -rf \
$(PUBLIC_DIR) \
.coverage \
.mypy_cache \
.pdm-build \
.pdm-python \
.pytest_cache \
.ruff_cache \
Pipfile* \
__pypackages__ \
build \
coverage.xml \
dist
find . -name '*.egg-info' -print0 | xargs -0 rm -rf
find . -name '*.pyc' -print0 | xargs -0 rm -f
find . -name '*.swp' -print0 | xargs -0 rm -f
find . -name '.DS_Store' -print0 | xargs -0 rm -f
find . -name '__pycache__' -print0 | xargs -0 rm -rf
# Remove pre-commit hook, virtual environment alongside intermediate files.
deepclean: clean
if command -v pre-commit > /dev/null 2>&1; then pre-commit uninstall; fi
if command -v pdm >/dev/null 2>&1 && pdm venv list | grep -q in-project ; then pdm venv remove --yes in-project >/dev/null 2>&1; fi
# Install the package in editable mode.
install:
pdm install --prod
# Install the package in editable mode with specific optional dependencies.
dev-%: install
pdm install --lockfile pdm.dev.lock --no-default --dev --group $*
# Prepare the development environment.
# Install the package in editable mode with all optional dependencies and pre-commit hook.
dev: install
pdm install --lockfile pdm.dev.lock --no-default --dev
if [ "$(CI)" != "true" ] && command -v pre-commit > /dev/null 2>&1; then pre-commit install; fi
# Lock both prod and dev dependencies.
lock:
pdm lock --prod --update-reuse-installed
pdm lock --lockfile pdm.dev.lock --no-default --dev --update-reuse-installed
# Install standalone tools
prerequisites:
pipx list --short | grep -q "check-jsonschema 0.31.0" || pipx install --force check-jsonschema==0.31.0
pipx list --short | grep -q "codespell 2.4.1" || pipx install --force codespell[toml]==2.4.1
pipx list --short | grep -q "pdm 2.22.3" || pipx install --force pdm==2.22.3
pipx list --short | grep -q "pre-commit 4.1.0" || pipx install --force pre-commit==4.1.0
pipx list --short | grep -q "pyproject-fmt 2.5.0" || pipx install --force pyproject-fmt==2.5.0
pipx list --short | grep -q "ruff 0.9.3" || pipx install --force ruff==0.9.3
pipx list --short | grep -q "watchfiles 1.0.4" || pipx install --force watchfiles==1.0.4
########################################################################################
# Lint and pre-commit
########################################################################################
# Check lint with mypy.
mypy:
pdm run python -m mypy . --html-report $(PUBLIC_DIR)/reports/mypy
# Lint with ruff.
ruff:
ruff check .
# Format with ruff.
ruff-format:
ruff format --check .
# Check lint with pyproject-fmt.
pyproject-fmt:
pyproject-fmt pyproject.toml
# Check lint with codespell.
codespell:
codespell
# Check jsonschema with check-jsonschema.
check-jsonschema:
check-jsonschema --builtin-schema vendor.github-workflows .github/workflows/*.yml
check-jsonschema --builtin-schema vendor.readthedocs .readthedocs.yaml
check-jsonschema --builtin-schema vendor.renovate --regex-variant nonunicode .renovaterc.json
# Check lint with all linters.
lint: mypy ruff ruff-format pyproject-fmt codespell check-jsonschema
# Run pre-commit with autofix against all files.
pre-commit:
pre-commit run --all-files --hook-stage manual
########################################################################################
# Test
########################################################################################
# Clean and run test with coverage.
test-run:
pdm run python -m coverage erase
pdm run python -m coverage run -m pytest
# Generate coverage report for terminal and xml.
test: test-run
pdm run python -m coverage report
pdm run python -m coverage xml
########################################################################################
# Package
########################################################################################
# Build the package.
build:
pdm build
# Publish the package.
publish:
pdm publish
########################################################################################
# Documentation
########################################################################################
# Generate documentation with auto build when changes happen.
doc-watch:
pdm run python -m http.server --directory public &
watchfiles "make doc-build" docs src README.md
# Build documentation only from src.
doc-build:
pdm run sphinx-build --fail-on-warning --write-all docs $(PUBLIC_DIR)
# Generate html coverage reports with badge.
doc-coverage: test-run
pdm run python -m coverage html -d $(PUBLIC_DIR)/reports/coverage
pdm run bash scripts/generate-coverage-badge.sh $(PUBLIC_DIR)/_static/badges
# Generate all documentation with reports.
doc: doc-build mypy doc-coverage
########################################################################################
# End
########################################################################################