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
|
# Makefile for scriv
#
# To release:
# - increment the version in src/scriv/__init__.py
# - scriv collect
# - commit changes
# - make check_release
# - make release
.DEFAULT_GOAL := help
# For opening files in a browser. Use like: $(BROWSER)relative/path/to/file.html
BROWSER := python -m webbrowser file://$(CURDIR)/
# A command to get the current version. A little slow, but only run when needed.
VERSION := $$(python -c "import build.util as bu; print(bu.project_wheel_metadata('.')['Version'])")
.PHONY: help clean sterile
help: ## display this help message
@echo "Please use \`make <target>' where <target> is one of"
@awk -F ':.*?## ' '/^[a-zA-Z]/ && NF==2 {printf "\033[36m %-25s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | sort
clean: ## remove generated byte code, coverage reports, and build artifacts
find . -name '__pycache__' -exec rm -rf {} +
find . -name '*.pyc' -exec rm -f {} +
find . -name '*.pyo' -exec rm -f {} +
find . -name '*~' -exec rm -f {} +
-coverage erase
rm -fr coverage.json
rm -fr build/
rm -fr dist/
rm -fr *.egg-info
rm -fr htmlcov/
rm -fr .*_cache/
cd docs; make clean
sterile: clean ## remove absolutely all built artifacts
rm -fr .tox
.PHONY: coverage docs upgrade diff_upgrade
coverage: clean ## generate and view HTML coverage report
tox -e py39,py313,coverage
$(BROWSER)htmlcov/index.html
docs: botedits ## generate Sphinx HTML documentation, including API docs
tox -e docs
$(BROWSER)docs/_build/html/index.html
PIP_COMPILE = pip-compile --upgrade --resolver=backtracking -c requirements/constraints.txt --no-strip-extras
upgrade: export CUSTOM_COMPILE_COMMAND=make upgrade
upgrade: ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in
pip install -qr requirements/pip-tools.txt
# Make sure to compile files after any other files they include!
$(PIP_COMPILE) -o requirements/pip-tools.txt requirements/pip-tools.in
$(PIP_COMPILE) -o requirements/base.txt requirements/base.in
$(PIP_COMPILE) -o requirements/test.txt requirements/test.in
$(PIP_COMPILE) -o requirements/doc.txt requirements/doc.in
$(PIP_COMPILE) -o requirements/quality.txt requirements/quality.in
$(PIP_COMPILE) -o requirements/tox.txt requirements/tox.in
$(PIP_COMPILE) -o requirements/dev.txt requirements/dev.in
diff_upgrade: ## summarize the last `make upgrade`
@# The sort flags sort by the package name first, then by the -/+, and
@# sort by version numbers, so we get a summary with lines like this:
@# -bashlex==0.16
@# +bashlex==0.17
@# -build==0.9.0
@# +build==0.10.0
@git diff -U0 | grep -v '^@' | grep == | sort -k1.2,1.99 -k1.1,1.1r -u -V
.PHONY: botedits quality requirements test test-all validate
botedits: ## make source edits by tools
python -m black --line-length=80 src/scriv tests docs
python -m cogapp -crP docs/*.rst
quality: ## check coding style with pycodestyle and pylint
tox -e quality
requirements: ## install development environment requirements
pip install -qr requirements/pip-tools.txt
pip-sync requirements/dev.txt
pip install -e .
test: ## run tests in the current virtualenv
tox -e py39
test-all: ## run tests on every supported Python combination
tox
validate: clean botedits quality test ## run tests and quality checks
.PHONY: dist pypi testpypi tag gh_release comment_text
dist: ## build the distributions
python -m build --sdist --wheel
pypi: ## upload the built distributions to PyPI.
python -m twine upload --verbose dist/*
testpypi: ## upload the distrubutions to PyPI's testing server.
python -m twine upload --verbose --repository testpypi dist/*
tag: ## make a git tag with the version number
git tag -s -m "Version $(VERSION)" $(VERSION)
git push --all
gh_release: ## make a GitHub release
python -m scriv github-release --all --fail-if-warn --check-links
comment_text:
@echo "Use this to comment on issues and pull requests:"
@echo "This is now released as part of [scriv $(VERSION)](https://pypi.org/project/scriv/$(VERSION))."
.PHONY: release check_release _check_credentials _check_manifest _check_tree _check_version _check_scriv _check_links
release: _check_credentials clean check_release dist pypi tag gh_release comment_text ## do all the steps for a release
check_release: _check_manifest _check_tree _check_version _check_scriv _check_links ## check that we are ready for a release
@echo "Release checks passed"
_check_credentials:
@if [[ -z "$$TWINE_PASSWORD" ]]; then \
echo 'Missing TWINE_PASSWORD: opvars'; \
exit 1; \
fi
@if [[ -z "$$GITHUB_TOKEN" ]]; then \
echo 'Missing GITHUB_TOKEN: opvars github'; \
exit 1; \
fi
_check_manifest:
python -m check_manifest
_check_tree:
@if [[ -n $$(git status --porcelain) ]]; then \
echo 'There are modified files! Did you forget to check them in?'; \
exit 1; \
fi
_check_version:
@if [[ $$(git tags | grep -q -w $(VERSION) && echo "x") == "x" ]]; then \
echo 'A git tag for this version exists! Did you forget to bump the version in src/scriv/__init__.py?'; \
exit 1; \
fi
_check_scriv:
@if [[ $$(find -E changelog.d -regex '.*\.(md|rst)$$') ]]; then \
echo 'There are scriv fragments! Did you forget `scriv collect`?'; \
exit 1; \
fi
_check_links:
python -m scriv github-release --dry-run --fail-if-warn --check-links
|