-
Notifications
You must be signed in to change notification settings - Fork 5
/
Makefile
199 lines (154 loc) · 6.17 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
187
188
189
190
191
192
193
194
195
196
197
198
199
# Autodocumented Makefile
# see: https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
# Dependencies : python3 venv
# Some Makefile global variables can be set in make command line
# Recall: .PHONY defines special targets not associated with files
############### GLOBAL VARIABLES ######################
.DEFAULT_GOAL := help
# Set shell to BASH
SHELL := /bin/bash
# Set Virtualenv directory name
# Exemple: VENV="other-venv/" make install
ifndef VENV
VENV = "venv"
endif
# Check python install in VENV
CHECK_MC-CNN = $(shell ${VENV}/bin/python3 -m pip list|grep MCCNN)
# Browser definition
define BROWSER_PYSCRIPT
import os, webbrowser, sys
from urllib.request import pathname2url
webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1])))
endef
export BROWSER_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
# Python global variables definition
PYTHON_VERSION_MIN = 3.8
PYTHON=$(shell command -v python3)
PYTHON_VERSION_CUR=$(shell $(PYTHON) -c 'import sys; print("%d.%d"% sys.version_info[0:2])')
PYTHON_VERSION_OK=$(shell $(PYTHON) -c 'import sys; cur_ver = sys.version_info[0:2]; min_ver = tuple(map(int, "$(PYTHON_VERSION_MIN)".split("."))); print(int(cur_ver >= min_ver))')
############### Check python version supported ############
ifeq (, $(PYTHON))
$(error "PYTHON=$(PYTHON) not found in $(PATH)")
endif
ifeq ($(PYTHON_VERSION_OK), 0)
$(error "Requires python version >= $(PYTHON_VERSION_MIN). Current version is $(PYTHON_VERSION_CUR)")
endif
################ MAKE targets by sections ######################
help: ## this help
@echo " MC-CNN LIBRARY MAKE HELP"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
.PHONY: venv
venv: ## create virtualenv in "venv" dir if not exists
@test -d ${VENV} || python3 -m venv ${VENV}
@touch ${VENV}/bin/activate
@${VENV}/bin/python -m pip install --upgrade wheel setuptools pip # no check to upgrade each time
.PHONY: install
install: venv ## install environment for development target (depends venv)
@[ "${CHECK_MC-CNN}" ] || echo "Install mc_cnn package from local directory"
@[ "${CHECK_MC-CNN}" ] || ${VENV}/bin/pip install -e .[dev,docs]
@test -f .git/hooks/pre-commit || echo "Install pre-commit"
@test -f .git/hooks/pre-commit || ${VENV}/bin/pre-commit install -t pre-commit
@test -f .git/hooks/pre-push || ${VENV}/bin/pre-commit install -t pre-push
@[ "${CHECK_MC-CNN}" ] || echo "MC-CNN library installed in dev mode in virtualenv ${VENV}"
@[ "${CHECK_MC-CNN}" ] || echo "MC-CNN library venv usage : source ${VENV}/bin/activate; python3 -c 'import mc_cnn' "
## Test section
.PHONY: test
test: install ## run tests and coverage quickly with the default Python
@${VENV}/bin/pytest -o log_cli=true --cov-config=.coveragerc --cov --cov-report=xml --junitxml=pytest-report.xml
.PHONY: test-all
test-all: install ## run tests on every Python version with tox
@${VENV}/bin/tox -r -p auto ## recreate venv (-r) and parallel mode (-p auto)
.PHONY: coverage
coverage: install ## check code coverage quickly with the default Python
@${VENV}/bin/coverage run --source mc_cnn -m pytest
@${VENV}/bin/coverage report -m
@${VENV}/bin/coverage html
$(BROWSER) htmlcov/index.html
## Code quality, linting section
### Format with isort and black
.PHONY: format
format: install format/black ## run black and isort formatting (depends install)
.PHONY: format/black
format/black: install ## run black formatting (depends install)
@echo "+ $@"
@${VENV}/bin/black mc_cnn tests
### Check code quality and linting : isort, black, flake8, pylint
.PHONY: lint
lint: install lint/black lint/pylint ## check code quality and linting
.PHONY: lint/black
lint/black: ## check global style with black
@echo "+ $@"
@${VENV}/bin/black --check mc_cnn tests
.PHONY: lint/pylint
lint/pylint: ## check linting with pylint
@echo "+ $@"
@set -o pipefail; ${VENV}/bin/pylint mc_cnn tests --rcfile=.pylintrc --output-format=parseable | tee pylint-report.txt # pipefail to propagate pylint exit code in bash
## Documentation section
.PHONY: docs
docs: install ## generate Sphinx HTML documentation, including API docs
@${VENV}/bin/sphinx-build -M clean docs/source/ docs/build
@${VENV}/bin/sphinx-build -M html docs/source/ docs/build -W --keep-going
$(BROWSER) docs/build/html/index.html
## Release section
.PHONY: dist
dist: clean install ## clean, install, builds source and wheel package
@${VENV}/bin/python -m pip install --upgrade build
@${VENV}/bin/python -m build
ls -l dist
.PHONY: release
release: dist ## package and upload a release
@${VENV}/bin/twine check dist/*
@${VENV}/bin/twine upload dist/* --verbose ## update your .pypirc accordingly
## Clean section
.PHONY: clean
clean: clean-venv clean-build clean-precommit clean-pyc clean-test clean-lint clean-docs clean-notebook ## clean all (except docker)
.PHONY: clean-venv
clean-venv: ## clean venv
@echo "+ $@"
@rm -rf ${VENV}
.PHONY: clean-build
clean-build: ## remove build artifacts
@echo "+ $@"
@rm -fr build/
@rm -fr dist/
@rm -fr .eggs/
@find . -name '*.egg-info' -exec rm -fr {} +
@find . -name '*.egg' -exec rm -f {} +
.PHONY: clean-precommit
clean-precommit: ## clean precommit hooks in .git/hooks
@rm -f .git/hooks/pre-commit
@rm -f .git/hooks/pre-push
.PHONY: clean-pyc
clean-pyc: ## remove Python file artifacts
@echo "+ $@"
@find . -type f -name "*.py[co]" -exec rm -fr {} +
@find . -type d -name "__pycache__" -exec rm -fr {} +
@find . -name '*~' -exec rm -fr {} +
.PHONY: clean-test
clean-test: ## remove test and coverage artifacts
@echo "+ $@"
@rm -fr .tox/
@rm -f .coverage
@rm -rf .coverage.*
@rm -rf coverage.xml
@rm -fr htmlcov/
@rm -fr .pytest_cache
@rm -f pytest-report.xml
@find . -type f -name "debug.log" -exec rm -fr {} +
.PHONY: clean-lint
clean-lint: ## remove linting artifacts
@echo "+ $@"
@rm -f pylint-report.txt
@rm -f pylint-report.xml
@rm -rf .mypy_cache/
.PHONY: clean-docs
clean-docs: ## clean builded documentations
@echo "+ $@"
@rm -rf docs/build/
@rm -rf docs/source/api_reference/
@rm -rf docs/source/apidoc/
.PHONY: clean-notebook
clean-notebook: ## clean notebooks cache
@echo "+ $@"
@find . -type d -name ".ipynb_checkpoints" -exec rm -fr {} +