forked from starenka/mailjetv3
-
Notifications
You must be signed in to change notification settings - Fork 41
/
Makefile
161 lines (125 loc) · 4.92 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
.PHONY: clean clean-env clean-test clean-pyc clean-build clean-other help dev test test-debug test-cov pre-commit lint format format-docs analyze docs
.DEFAULT_GOAL := help
# The `.ONESHELL` and setting `SHELL` allows us to run commands that require
# `conda activate`
.ONESHELL:
SHELL := /bin/bash
# For GNU Make v4 and above, you must include the `-c` in order for `make` to find symbols from `PATH`
.SHELLFLAGS := -c -o pipefail -o errexit
CONDA_ACTIVATE = source $$(conda info --base)/etc/profile.d/conda.sh ; conda activate ; conda activate
# Ensure that we are using the python interpreter provided by the conda environment.
PYTHON3 := "$(CONDA_PREFIX)/bin/python3"
CONDA_ENV_NAME ?= mailjet
SRC_DIR = mailjet_rest
TEST_DIR = tests
SCRIPTS_DIR = scripts/
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
define PRINT_HELP_PYSCRIPT
import re, sys
for line in sys.stdin:
match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line)
if match:
target, help = match.groups()
print("%-20s %s" % (target, help))
endef
export PRINT_HELP_PYSCRIPT
BROWSER := python -c "$$BROWSER_PYSCRIPT"
clean: clean-cov clean-build clean-env clean-pyc clean-test clean-temp clean-other ## remove all build, test, coverage and Python artifacts
clean-cov:
rm -rf .coverage
rm -rf htmlcov
rm -rf reports/{*.html,*.png,*.js,*.css,*.json}
rm -rf pytest.xml
rm -rf pytest-coverage.txt
clean-build: ## remove build artifacts
rm -fr build/
rm -fr dist/
rm -fr .eggs/
find . -name '*.egg-info' -exec rm -fr {} +
find . -name '*.egg' -exec rm -f {} +
clean-env: ## remove conda environment
conda remove -y -n $(CONDA_ENV_NAME) --all ; conda info
clean-pyc: ## remove Python file artifacts
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
find . -name '__pycache__' -exec rm -fr {} +
clean-test: ## remove test and coverage artifacts
rm -fr .tox/
rm -f .coverage
rm -fr htmlcov/
rm -fr .pytest_cache
clean-temp: ## remove temp artifacts
rm -fr temp/tmp.txt
rm -fr tmp.txt
clean-other:
rm -fr *.prof
rm -fr profile.html profile.json
rm -fr wget-log
rm -fr logs/*.log
rm -fr *.txt
help:
$(PYTHON3) -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST)
environment: ## handles environment creation
conda env create -f environment.yaml --name $(CONDA_ENV_NAME) --yes
conda run --name $(CONDA_ENV_NAME) pip install .
install: clean ## install the package to the active Python's site-packages
pip install .
release: dist ## package and upload a release
twine upload dist/*
dist: clean ## builds source and wheel package
python -m build
ls -l dist
dev: clean ## install the package's development version to a fresh environment
conda env create -f environment.yaml --name $(CONDA_ENV_NAME) --yes
conda run --name $(CONDA_ENV_NAME) pip install -e .
$(CONDA_ACTIVATE) $(CONDA_ENV_NAME) && pre-commit install
dev-full: clean ## install the package's development version to a fresh environment
conda env create -f environment-dev.yaml --name $(CONDA_ENV_NAME) --yes
conda run --name $(CONDA_ENV_NAME) pip install -e .
$(CONDA_ACTIVATE) $(CONDA_ENV_NAME) && pre-commit install
pre-commit: ## runs pre-commit against files. NOTE: older files are disabled in the pre-commit config.
pre-commit run --all-files
test: ## runs test cases
$(PYTHON3) -m pytest -n auto --capture=no $(TEST_DIR) test.py
test-debug: ## runs test cases with debugging info enabled
$(PYTHON3) -m pytest -n auto -vv --capture=no $(TEST_DIR) test.py
test-cov: ## checks test coverage requirements
$(PYTHON3) -m pytest -n auto --cov-config=.coveragerc --cov=$(SRC_DIR) \
$(TEST_DIR) --cov-fail-under=80 --cov-report term-missing
tests-cov-fail:
@pytest --cov=$(SRC_DIR) --cov-report term-missing --cov-report=html --cov-fail-under=80
coverage: ## check code coverage quickly with the default Python
coverage run --source $(SRC_DIR) -m pytest
coverage report -m
coverage html
$(BROWSER) htmlcov/index.html
lint-black:
black --line-length=80 $(SRC_DIR) $(TEST_DIR)
lint-isort:
isort --profile black --line-length=80 $(SRC_DIR) $(TEST_DIR)
lint-flake8:
@flake8 $(SRC_DIR) $(TEST_DIR)
lint-pylint:
pylint --rcfile=.pylintrc $(SRC_DIR) $(TEST_DIR)
lint-refurb:
@refurb $(SRC_DIR)
format-black:
@black --line-length=88 $(SRC_DIR) $(TEST_DIR) $(SCRIPTS_DIR)
format-isort:
@isort --profile black --line-length=88 $(SRC_DIR) $(TEST_DIR) $(SCRIPTS_DIR)
format: format-black format-isort
format: ## runs the code auto-formatter
isort
black
format-docs: ## runs the docstring auto-formatter. Note this requires manually installing `docconvert` with `pip`
docconvert --in-place --config .docconvert.json $(SRC_DIR)
analyze: ## runs static analyzer on the project
mypy --config-file=.mypy.ini --cache-dir=/dev/null $(SRC_DIR) $(TEST_DIR) $(SCRIPTS_DIR)
lint-mypy-report:
@mypy $(SRC_DIR) --html-report ./mypy_html