-
Notifications
You must be signed in to change notification settings - Fork 9
/
Makefile
149 lines (129 loc) · 4.16 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
.PHONY: clean lint test doc
# main directory with source code
PROJECT_NAME = trend_classifier
# use open for macOS, xdg-open for Linux
UNAME := $(shell uname -s)
ifeq ($(UNAME), Linux)
OPEN := xdg-open
endif
ifeq ($(UNAME), Darwin)
OPEN := open
endif
## Delete all compiled Python files
clean:
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
## Create a virtual environment in the .venv folder in current directory.
create-venv:
@echo -e "$(COLOR_CYAN)Creating virtual environment in the project folder...$(COLOR_RESET)" && \
poetry config --local virtualenvs.in-project true
poetry shell
## Lint package using pre-commit
lint:
pre-commit run --all-files
## Run tests using pytest
test:
pytest tests/
## Create coverage report for package
coverage:
pytest --cov-report html --cov $(PROJECT_NAME) --verbose
## Return coverage percentage for package
coverage_num:
@pytest --cov $(PROJECT_NAME)
@coverage xml
@coverage report | tail -n 1 | awk -F' ' '{print $$6}'
## Show HTML report for trend_classifier package coverage
coverage_show:
$(OPEN) htmlcov/index.html
## Generate pdoc HTML documentation for trend_classifier package
doc:
pdoc --force --html --output-dir ./docs $(PROJECT_NAME)
mv docs/$(PROJECT_NAME)/* docs
rmdir docs/$(PROJECT_NAME)
## Generate pdoc HTML documentation for trend_classifier package and open in browser
doc_view:
pdoc --force --html --output-dir ./docs $(PROJECT_NAME)
mv docs/$(PROJECT_NAME)/* docs
rmdir docs/$(PROJECT_NAME)
$(OPEN) ./docs/index.html
## Generate requirements.txt and requirements-test.txt files
reqs:
poetry export -f requirements.txt --output requirements.txt
poetry export -f requirements.txt --with test --output requirements-test.txt
## Upgrade package versions for tox
tox_reqs_update:
pip-upgrade tox-reqs/all.txt --skip-package-installation
## Upgrade all (requirements used in tox envs, pyproject dependencies, pre-commit hooks)
update: tox_reqs_update
pre-commit autoupdate
pre-commit gc
poetry update
## Install poetry plugins.
poetry-plugins:
@echo -e "$(COLOR_CYAN)Installing poetry plugins...$(COLOR_RESET)" && \
poetry self add poetry-audit-plugin
poetry self add poetry-plugin-export
## Run the check for vulnerabilities in the dependencies.
audit:
# NOTE: This requires the 'poetry-audit-plugin' to be installed.
# to install use e.g. $ poetry self add poetry-audit-plugin
@echo -e "$(COLOR_CYAN)Running security audit based on 'safety'...$(COLOR_RESET)"
poetry audit
#################################################################################
# Self Documenting Commands #
#################################################################################
.DEFAULT_GOAL := help
# Inspired by <http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html>
# sed script explained:
# /^##/:
# * save line in hold space
# * purge line
# * Loop:
# * append newline + line to hold space
# * go to next line
# * if line starts with doc comment, strip comment character off and loop
# * remove target prerequisites
# * append hold space (+ newline) to line
# * replace newline plus comments by `---`
# * print line
# Separate expressions are necessary because labels cannot be delimited by
# semicolon; see <http://stackoverflow.com/a/11799865/1968>
.PHONY: help
help:
@echo "$$(tput bold)Available rules:$$(tput sgr0)"
@echo
@sed -n -e "/^## / { \
h; \
s/.*//; \
:doc" \
-e "H; \
n; \
s/^## //; \
t doc" \
-e "s/:.*//; \
G; \
s/\\n## /---/; \
s/\\n/ /g; \
p; \
}" ${MAKEFILE_LIST} \
| LC_ALL='C' sort --ignore-case \
| awk -F '---' \
-v ncol=$$(tput cols) \
-v indent=19 \
-v col_on="$$(tput setaf 6)" \
-v col_off="$$(tput sgr0)" \
'{ \
printf "%s%*s%s ", col_on, -indent, $$1, col_off; \
n = split($$2, words, " "); \
line_length = ncol - indent; \
for (i = 1; i <= n; i++) { \
line_length -= length(words[i]) + 1; \
if (line_length <= 0) { \
line_length = ncol - indent - length(words[i]) - 1; \
printf "\n%*s ", -indent, " "; \
} \
printf "%s ", words[i]; \
} \
printf "\n"; \
}' \
| more $(shell test $(shell uname) = Darwin && echo '--no-init --raw-control-chars')