bootstrapit update

This commit is contained in:
Manuel Barkhau 2020-05-25 07:45:46 +00:00
parent 02597962d0
commit 4d8395050f
9 changed files with 94 additions and 57 deletions

2
.gitignore vendored
View file

@ -46,6 +46,7 @@ pip-delete-this-directory.txt
# Unit test / coverage reports # Unit test / coverage reports
htmlcov/ htmlcov/
mypycov/ mypycov/
reports/
.tox/ .tox/
.coverage .coverage
.cache .cache
@ -71,3 +72,4 @@ README.html
envs.txt envs.txt
test_build_logs/*.log test_build_logs/*.log
build/miniconda3.sh build/miniconda3.sh
compat_test/

View file

@ -215,9 +215,9 @@ projects by reducing the burdon of project setup to a minimum.
CHANGELOG.md # short documentation of release history CHANGELOG.md # short documentation of release history
LICENSE # for public libraries (MIT preferred) LICENSE # for public libraries (MIT preferred)
makefile # main project and environment management file makefile # project specific configuration
makefile.config.make # project configuration variables # variables and make targets
makefile.extra.make # project specific make targets makefile.bootstrapit.make # bootstrapit make include library
docker_base.Dockerfile # base image for CI (only conda envs) docker_base.Dockerfile # base image for CI (only conda envs)
Dockerfile # image with source of the project Dockerfile # image with source of the project

View file

@ -10,9 +10,8 @@ ADD README.md README.md
ADD CHANGELOG.md CHANGELOG.md ADD CHANGELOG.md CHANGELOG.md
ADD LICENSE LICENSE ADD LICENSE LICENSE
ADD makefile makefile ADD makefile makefile
ADD makefile.config.make makefile.config.make ADD makefile.bootstrapit.make makefile.bootstrapit.make
ADD makefile.extra.make makefile.extra.make
ENV PYTHONPATH="src/:vendor/" ENV PYTHONPATH="src/:vendor/"
CMD make test_compat CMD make lint test_compat

View file

@ -1,6 +1,4 @@
MIT License MIT License Copyright (c) 2020 Manuel Barkhau (mbarkhau@gmail.com)
Copyright (c) 2019 Manuel Barkhau (mbarkhau@gmail.com)
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -32,8 +32,7 @@ RUN if ! test -z "${ENV_SSH_PRIVATE_RSA_KEY}"; then \
ADD requirements/ requirements/ ADD requirements/ requirements/
ADD scripts/ scripts/ ADD scripts/ scripts/
ADD makefile.extra.make makefile.extra.make ADD makefile.bootstrapit.make makefile.bootstrapit.make
ADD makefile.config.make makefile.config.make
ADD makefile makefile ADD makefile makefile
RUN make install RUN make install

View file

@ -3,7 +3,7 @@ Individual files contain the following tag instead of the full license text.
This file is part of the pycalver project This file is part of the pycalver project
https://gitlab.com/mbarkhau/pycalver https://gitlab.com/mbarkhau/pycalver
Copyright (c) 2019 Manuel Barkhau (mbarkhau@gmail.com) - MIT License Copyright (c) 2020 Manuel Barkhau (mbarkhau@gmail.com) - MIT License
SPDX-License-Identifier: MIT SPDX-License-Identifier: MIT
This enables machine processing of license information based on the SPDX This enables machine processing of license information based on the SPDX

View file

@ -10,7 +10,6 @@ SHELL := /bin/bash
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
.SUFFIXES: .SUFFIXES:
PROJECT_DIR := $(notdir $(abspath .)) PROJECT_DIR := $(notdir $(abspath .))
ifndef DEVELOPMENT_PYTHON_VERSION ifndef DEVELOPMENT_PYTHON_VERSION
@ -48,7 +47,7 @@ CONDA_ENV_PATHS := \
# envname/bin/pypy3 # envname/bin/pypy3
CONDA_ENV_BIN_PYTHON_PATHS := \ CONDA_ENV_BIN_PYTHON_PATHS := \
$(shell echo "$(CONDA_ENV_PATHS)" \ $(shell echo "$(CONDA_ENV_PATHS)" \
| sed 's!\(_py[[:digit:]]\+\)!\1/bin/python!g' \ | sed 's!\(_py[[:digit:]]\{1,\}\)!\1/bin/python!g' \
| sed 's!\(_pypy2[[:digit:]]\)!\1/bin/pypy!g' \ | sed 's!\(_pypy2[[:digit:]]\)!\1/bin/pypy!g' \
| sed 's!\(_pypy3[[:digit:]]\)!\1/bin/pypy3!g' \ | sed 's!\(_pypy3[[:digit:]]\)!\1/bin/pypy3!g' \
) )
@ -85,13 +84,13 @@ build/envs.txt: requirements/conda.txt
@if [[ ! -f $(CONDA_BIN) ]]; then \ @if [[ ! -f $(CONDA_BIN) ]]; then \
echo "installing miniconda ..."; \ echo "installing miniconda ..."; \
if [[ $(PLATFORM) == "Linux" ]]; then \ if [[ $(PLATFORM) == "Linux" ]]; then \
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" \ curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" --location \
> build/miniconda3.sh; \ > build/miniconda3.sh; \
elif [[ $(PLATFORM) == "MINGW64_NT-10.0" ]]; then \ elif [[ $(PLATFORM) == "MINGW64_NT-10.0" ]]; then \
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" \ curl "https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh" --location \
> build/miniconda3.sh; \ > build/miniconda3.sh; \
elif [[ $(PLATFORM) == "Darwin" ]]; then \ elif [[ $(PLATFORM) == "Darwin" ]]; then \
curl "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh" \ curl "https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh" --location \
> build/miniconda3.sh; \ > build/miniconda3.sh; \
fi; \ fi; \
bash build/miniconda3.sh -b -p $(CONDA_ROOT); \ bash build/miniconda3.sh -b -p $(CONDA_ROOT); \
@ -164,7 +163,7 @@ help:
helpCommand, helpMessage; \ helpCommand, helpMessage; \
helpMessage = ""; \ helpMessage = ""; \
} \ } \
} else if ($$0 ~ /^[a-zA-Z\-\_0-9.]+:/) { \ } else if ($$0 ~ /^[a-zA-Z\-\_0-9.\/]+:/) { \
helpCommand = substr($$0, 0, index($$0, ":")); \ helpCommand = substr($$0, 0, index($$0, ":")); \
if (helpMessage) { \ if (helpMessage) { \
printf "\033[36m%-20s\033[0m %s\n", \ printf "\033[36m%-20s\033[0m %s\n", \
@ -182,7 +181,7 @@ help:
helpMessage = ""; \ helpMessage = ""; \
} \ } \
}' \ }' \
$(MAKEFILE_LIST) makefile.bootstrapit.make makefile
@if [[ ! -f $(DEV_ENV_PY) ]]; then \ @if [[ ! -f $(DEV_ENV_PY) ]]; then \
echo "Missing python interpreter at $(DEV_ENV_PY) !"; \ echo "Missing python interpreter at $(DEV_ENV_PY) !"; \
@ -216,7 +215,7 @@ helpverbose:
helpCommand, helpMessage; \ helpCommand, helpMessage; \
helpMessage = ""; \ helpMessage = ""; \
} \ } \
} else if ($$0 ~ /^[a-zA-Z\-\_0-9.]+:/) { \ } else if ($$0 ~ /^[a-zA-Z\-\_0-9.\/]+:/) { \
helpCommand = substr($$0, 0, index($$0, ":")); \ helpCommand = substr($$0, 0, index($$0, ":")); \
if (helpMessage) { \ if (helpMessage) { \
printf "\033[36m%-20s\033[0m %s\n", \ printf "\033[36m%-20s\033[0m %s\n", \
@ -236,7 +235,7 @@ helpverbose:
helpMessage = ""; \ helpMessage = ""; \
} \ } \
}' \ }' \
$(MAKEFILE_LIST) makefile.bootstrapit.make makefile
## -- Project Setup -- ## -- Project Setup --
@ -301,11 +300,18 @@ git_hooks:
## -- Integration -- ## -- Integration --
## Run flake8 linter ## Run flake8 linter and check for fmt
.PHONY: lint .PHONY: lint
lint: lint:
@printf "flake8 ..\n" @printf "isort ..\n"
@$(DEV_ENV)/bin/flake8 src/ @$(DEV_ENV)/bin/isort \
--check-only \
--force-single-line-imports \
--length-sort \
--recursive \
--line-width=$(MAX_LINE_LEN) \
--project $(PKG_NAME) \
src/ test/
@printf "\e[1F\e[9C ok\n" @printf "\e[1F\e[9C ok\n"
@printf "sjfmt ..\n" @printf "sjfmt ..\n"
@ -317,6 +323,10 @@ lint:
src/ test/ 2>&1 | sed "/All done/d" | sed "/left unchanged/d" src/ test/ 2>&1 | sed "/All done/d" | sed "/left unchanged/d"
@printf "\e[1F\e[9C ok\n" @printf "\e[1F\e[9C ok\n"
@printf "flake8 ..\n"
@$(DEV_ENV)/bin/flake8 src/
@printf "\e[1F\e[9C ok\n"
## Run mypy type checker ## Run mypy type checker
.PHONY: mypy .PHONY: mypy
@ -326,6 +336,7 @@ mypy:
@printf "mypy ....\n" @printf "mypy ....\n"
@MYPYPATH=stubs/:vendor/ $(DEV_ENV_PY) -m mypy \ @MYPYPATH=stubs/:vendor/ $(DEV_ENV_PY) -m mypy \
--html-report mypycov \ --html-report mypycov \
--no-error-summary \
src/ | sed "/Generated HTML report/d" src/ | sed "/Generated HTML report/d"
@printf "\e[1F\e[9C ok\n" @printf "\e[1F\e[9C ok\n"
@ -354,15 +365,27 @@ test:
@rm -rf "test/__pycache__"; @rm -rf "test/__pycache__";
# First we test the local source tree using the dev environment # First we test the local source tree using the dev environment
ENV=$${ENV-dev} PYTHONPATH=src/:vendor/:$$PYTHONPATH \ ENV=$${ENV-dev} \
PYTHONPATH=src/:vendor/:$$PYTHONPATH \
PATH=$(DEV_ENV)/bin:$$PATH \
$(DEV_ENV_PY) -m pytest -v \ $(DEV_ENV_PY) -m pytest -v \
--doctest-modules \ --doctest-modules \
--verbose \ --verbose \
--cov-report html \ --cov-report html \
--cov-report term \ --cov-report term \
$(shell cd src/ && ls -1 */__init__.py | awk '{ print "--cov "substr($$1,0,index($$1,"/")-1) }') \ -k "$${PYTEST_FILTER}" \
$(shell cd src/ && ls -1 */__init__.py | awk '{ sub(/\/__init__.py/, "", $$1); print "--cov "$$1 }') \
test/ src/; test/ src/;
# Next we install the package and run the test suite against it.
IFS=' ' read -r -a env_py_paths <<< "$(CONDA_ENV_BIN_PYTHON_PATHS)"; \
for i in $${!env_py_paths[@]}; do \
env_py=$${env_py_paths[i]}; \
$${env_py} -m pip install --upgrade .; \
PYTHONPATH="" ENV=$${ENV-dev} $${env_py} -m pytest test/; \
done;
@rm -rf ".pytest_cache"; @rm -rf ".pytest_cache";
@rm -rf "src/__pycache__"; @rm -rf "src/__pycache__";
@rm -rf "test/__pycache__"; @rm -rf "test/__pycache__";
@ -374,11 +397,20 @@ test:
## Run code formatter on src/ and test/ ## Run code formatter on src/ and test/
.PHONY: fmt .PHONY: fmt
fmt: fmt:
@$(DEV_ENV)/bin/isort \
--force-single-line-imports \
--length-sort \
--recursive \
--line-width=$(MAX_LINE_LEN) \
--project $(PKG_NAME) \
src/ test/;
@$(DEV_ENV)/bin/sjfmt \ @$(DEV_ENV)/bin/sjfmt \
--target-version=py36 \ --target-version=py36 \
--skip-string-normalization \ --skip-string-normalization \
--line-length=$(MAX_LINE_LEN) \ --line-length=$(MAX_LINE_LEN) \
src/ test/ src/ test/;
## Shortcut for make fmt lint mypy test ## Shortcut for make fmt lint mypy test
@ -429,7 +461,9 @@ activate:
## Drop into an ipython shell with correct env variables set ## Drop into an ipython shell with correct env variables set
.PHONY: ipy .PHONY: ipy
ipy: ipy:
@ENV=$${ENV-dev} PYTHONPATH=src/:vendor/:$$PYTHONPATH \ @ENV=$${ENV-dev} \
PYTHONPATH=src/:vendor/:$$PYTHONPATH \
PATH=$(DEV_ENV)/bin:$$PATH \
$(DEV_ENV)/bin/ipython $(DEV_ENV)/bin/ipython
@ -439,28 +473,19 @@ devtest:
@rm -rf "src/__pycache__"; @rm -rf "src/__pycache__";
@rm -rf "test/__pycache__"; @rm -rf "test/__pycache__";
ifdef FILTER ENV=$${ENV-dev} \
ENV=$${ENV-dev} PYTHONPATH=src/:vendor/:$$PYTHONPATH \ PYTHONPATH=src/:vendor/:$$PYTHONPATH \
PATH=$(DEV_ENV)/bin:$$PATH \
$(DEV_ENV_PY) -m pytest -v \ $(DEV_ENV_PY) -m pytest -v \
--doctest-modules \ --doctest-modules \
--no-cov \ --no-cov \
--durations 5 \
--verbose \ --verbose \
--capture=no \ --capture=no \
--exitfirst \ --exitfirst \
--failed-first \ --failed-first \
-k $(FILTER) \ -k "$${PYTEST_FILTER}" \
test/ src/; test/ src/;
else
ENV=$${ENV-dev} PYTHONPATH=src/:vendor/:$$PYTHONPATH \
$(DEV_ENV_PY) -m pytest -v \
--doctest-modules \
--no-cov \
--verbose \
--capture=no \
--exitfirst \
--failed-first \
test/ src/;
endif
@rm -rf "src/__pycache__"; @rm -rf "src/__pycache__";
@rm -rf "test/__pycache__"; @rm -rf "test/__pycache__";
@ -518,7 +543,8 @@ dist_upload:
$(DEV_ENV)/bin/twine check $$($(SDIST_FILE_CMD)); $(DEV_ENV)/bin/twine check $$($(SDIST_FILE_CMD));
$(DEV_ENV)/bin/twine check $$($(BDIST_WHEEL_FILE_CMD)); $(DEV_ENV)/bin/twine check $$($(BDIST_WHEEL_FILE_CMD));
$(DEV_ENV)/bin/twine upload $$($(SDIST_FILE_CMD)) $$($(BDIST_WHEEL_FILE_CMD)); $(DEV_ENV)/bin/twine upload --skip-existing \
$$($(SDIST_FILE_CMD)) $$($(BDIST_WHEEL_FILE_CMD));
## bump_version dist_build dist_upload ## bump_version dist_build dist_upload
@ -552,6 +578,3 @@ docker_build:
fi fi
docker push $(DOCKER_BASE_IMAGE) docker push $(DOCKER_BASE_IMAGE)

View file

@ -7,18 +7,28 @@
# #
# No dependencies required for production should be listed here. # No dependencies required for production should be listed here.
# oh ffs: https://gitlab.com/pycqa/flake8-docstrings/issues/36 # http://www.pydocstyle.org/en/4.0.0/release_notes.html
# Support for Python 2.x and PyPy has been dropped (#340).
pydocstyle<4 pydocstyle<4
flake8 flake8
flake8-bugbear flake8-bugbear
flake8-docstrings flake8-docstrings
flake8-builtins flake8-builtins
flake8-comprehensions flake8-comprehensions
flake8-junit-report
pylint pylint
mypy mypy
isort
# http://doc.pytest.org/en/latest/py27-py34-deprecation.html
# The pytest 4.6 series will be the last to support Python 2.7
# and 3.4, and is scheduled to be released by mid-2019.
# pytest 5.0 and onwards will support only Python 3.5+.
pytest<5.0 pytest<5.0
pytest-cov pytest-cov
pytest-html
readme_renderer[md] readme_renderer[md]
twine twine
@ -26,7 +36,6 @@ twine
md-toc md-toc
straitjacket straitjacket
pycalver pycalver
lib3to6
# needed for mypy coverage report # needed for mypy coverage report
lxml lxml

View file

@ -10,6 +10,7 @@ disallow_untyped_calls = True
follow_imports = silent follow_imports = silent
strict_optional = True strict_optional = True
ignore_missing_imports = True ignore_missing_imports = True
show_error_codes = True
[flake8] [flake8]
max-line-length = 100 max-line-length = 100
@ -27,10 +28,12 @@ ignore =
E221 E221
# Multiple spaces after operand # Multiple spaces after operand
E222 E222
# Multiple spaces before keyword # Multiple spaces after ':'
E272 E241
# Spaces around keyword/parameter equals # Spaces around keyword/parameter equals
E251 E251
# Multiple spaces before keyword
E272
# Line too long (B950 is used instead) # Line too long (B950 is used instead)
E501 E501
# Line break before binary op # Line break before binary op
@ -45,10 +48,14 @@ ignore =
D102 D102
# Missing docstring in public function # Missing docstring in public function
D103 D103
# Missing docstring in magic method
# D105
# Missing docstring on __init__ # Missing docstring on __init__
D107 D107
# No blank lines allowed after function docstring # No blank lines allowed after function docstring
D202 D202
# First line should end in a period
D400
# First line should be in imperative mood # First line should be in imperative mood
D401 D401
select = A,AAA,D,C,E,F,W,H,B,D212,D404,D405,D406,B901,B950 select = A,AAA,D,C,E,F,W,H,B,D212,D404,D405,D406,B901,B950