-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
186 lines (157 loc) · 6.33 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
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
#==================================================================
#
# FILE: smbus3/Makefile
#
# USAGE: make all
#
# DESCRIPTION: Create a virtualenv, run tests, builds docs,
# and other development tasks.
#
# REQUIREMENTS: python3, pip, venv
#
#==================================================================
# Help to list makefile targets:
# This is first so that it will be the default target.
.PHONY: help
help: Makefile
@echo "Available targets:"
@echo "==================="
@LC_ALL=C $(MAKE) -pRrq -f $(firstword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/(^|\n)# Files(\n|$$)/,/(^|\n)# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | grep -E -v -e '^[^[:alnum:]]' -e '^$@$$' | grep -E -v -e "_build"
# all runs softclean, then creates the venv and runs tests
.PHONY: all
all: softclean venv precommit format lint test typecheck coverage coverage_html_report docs
# venv sets up the virtualenv
# Tracked via a touchfile
venv: .venv/touchfile
.venv/touchfile: requirements_dev.txt setup.py setup.cfg
@echo "\n\033[0;32mSetting up venv\033[0m\n"
test -d .venv || python3 -m venv .venv
. .venv/bin/activate; pip install -r requirements_dev.txt; pip install .
touch .venv/touchfile
@echo "\n\033[0;32mvenv complete\033[0m\n"
# Force clearing the pip cache
.PHONY: _pip_cache_purge
_pip_cache_purge: venv
@echo "\n\033[0;32mClearing venv pip cache\033[0m\n"
. .venv/bin/activate; pip cache purge
@echo "\n\033[0;32mvenv pip cache purge complete\033[0m\n"
# Uninstall venv version of smbus3
.PHONY: _uninstall_smbus3
_uninstall_smbus3: venv
@echo "\n\033[0;32mUninstalling venv local 'smbus3'\033[0m\n"
. .venv/bin/activate; pip uninstall --yes smbus3
@echo "\n\033[0;32mvenv smbus3 uninstall complete\033[0m\n"
# Cleanup artifacts without changing venv
.PHONY: softclean
softclean:
rm -rf smbus3.egg-info
rm -rf dist
rm -rf build
rm -rf .ruff_cache
rm -rf .mypy_cache
rm -rf doc/_build
rm -rf doc/doctrees
rm -rf doc/man
rm -rf .coverage
rm -rf coverage.xml
rm -rf htmlcov
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
# Cleanup the venv and various build directories
.PHONY: clean
clean: softclean
rm -rf .venv
# Run the tests:
.PHONY: test
test: venv
@echo "\n\033[0;32mRunning smbus3 unittest suite\033[0m\n"
. .venv/bin/activate; coverage run -m unittest tests
@echo "\n\033[0;32msmbus3 unittest suite complete\033[0m\n"
# Typecheck the stub files with mypy
.PHONY: typecheck
typecheck: venv
@echo "\n\033[0;32mTypechecking with mypy\033[0m\n"
. .venv/bin/activate; mypy . --exclude "build/" --exclude "dist/"
@echo "\n\033[0;32mTypechecking complete\033[0m\n"
.PHONY: coverage
coverage: test
@echo "\n\033[0;32mGenerating CLI coverage report\033[0m\n"
. .venv/bin/activate; coverage report -m
.PHONY: coverage_html_report
coverage_html_report: test
@echo "\n\033[0;32mGenerating HTML coverage report\033[0m\n"
. .venv/bin/activate; coverage html
.PHONY: coverage_xml_report
coverage_xml_report: test
@echo "\n\033[0;32mGenerating XML coverage report\033[0m\n"
. .venv/bin/activate; coverage xml
.PHONY: _echo_coverage_total
_echo_coverage_total:
@. .venv/bin/activate; coverage json --quiet; python -c "import json; f = open('coverage.json'); s = f.read(); x = json.loads(s); print(x['totals']['percent_covered_display']); f.close()"
@rm -rf coverage.json
.PHONY: check_coverage
check_coverage: test
@if (( $$(make _echo_coverage_total) < 90 )); then exit 1; else echo "Coverage percentage >=90"; fi
# Build the docs:
docs: docs_html docs_man_page
@echo "\n\033[0;32mBuilding documentation complete!\033[0m\n"
docs_html: doc/_build/html/index.html
docs_man_page: doc/_build/man/smbus3.1
doc/_build/html/index.html: venv smbus3/smbus3.py smbus3/__init__.py doc/conf.py doc/Makefile
@echo "\n\033[0;32mBuilding Sphinx HTML docs\033[0m\n"
. .venv/bin/activate; cd doc && make html
@echo "\n\033[0;32mHTML docs complete\033[0m\n"
doc/_build/man/smbus3.1: venv smbus3/smbus3.py smbus3/__init__.py doc/conf.py doc/Makefile
@echo "\n\033[0;32mBuilding manpage\033[0m\n"
. .venv/bin/activate; cd doc && make man
@echo "\n\033[0;32mManpage complete\033[0m\n"
# Setup pre-commit
precommit: .venv/pre-commit-touchfile
.venv/pre-commit-touchfile: .pre-commit-config.yaml
@echo "\n\033[0;32mInstalling precommit hooks\033[0m\n"
. .venv/bin/activate; pre-commit install
touch .venv/pre-commit-touchfile
@echo "\n\033[0;32mPrecommit hooks installed successfully!\033[0m\n"
# Lint and format:
.PHONY: format
format: venv .ruff.toml
@echo "\n\033[0;32mRunning formatter\033[0m\n"
. .venv/bin/activate; ruff format .
@echo "\n\033[0;32mFormatting complete!\033[0m\n"
.PHONY: lint
lint: venv format .ruff.toml
@echo "\n\033[0;32mRunning linter\033[0m\n"
. .venv/bin/activate; ruff check --fix .
@echo "\n\033[0;32mLinting complete!\033[0m\n"
# Build the source distribution only:
.PHONY: buildsdist
buildsdist: clean venv precommit format lint test typecheck check_coverage
@echo "\n\033[0;32mBuilding source distribution (only)\033[0m\n"
. .venv/bin/activate; python -m build --sdist
@echo "\n\033[0;32mSource distribution build complete!\033[0m\n"
# Build the wheel binary distribution only:
.PHONY: buildwhl
buildwhl: clean venv precommit format lint test typecheck check_coverage
@echo "\n\033[0;32mBuilding wheel (only)\033[0m\n"
. .venv/bin/activate; python -m build --wheel
@echo "\n\033[0;32mWheel build complete!\033[0m\n"
# Build the package (sdist AND wheel):
.PHONY: buildpkg
buildpkg: clean venv precommit format lint test typecheck check_coverage
@echo "\n\033[0;32mBuilding source distribution and wheel\033[0m\n"
. .venv/bin/activate; python -m build
@echo "\n\033[0;32mBuild complete!\033[0m\n"
# Test built package
.PHONY: testpkg
testpkg: buildpkg _pip_cache_purge _uninstall_smbus3
@echo "\n\033[0;32mInstalling built .whl\033[0m\n"
. .venv/bin/activate; pip install dist/smbus3-*.whl
@echo "\n\033[0;32mRunning tests with installed .whl\033[0m\n"
make test
@echo "\n\033[0;32mSuccess! Tests with .whl passed!\033[0m\n"
.PHONY: testreleased
testreleased: venv _pip_cache_purge _uninstall_smbus3
@echo "\n\033[0;32mInstalling released PyPI package\033[0m\n"
. .venv/bin/activate; pip install --no-cache-dir smbus3
@echo "\n\033[0;32mRunning tests with installed package\033[0m\n"
make test
@echo "\n\033[0;32mSuccess! Tests with PyPI package passed!\033[0m\n"