diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8d3b6089..d0754db1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,4 @@ +--- repos: - repo: https://github.com/psf/black rev: 22.12.0 diff --git a/Dockerfile.testing b/Dockerfile.testing new file mode 100644 index 00000000..4641ea3c --- /dev/null +++ b/Dockerfile.testing @@ -0,0 +1,62 @@ +# Bakes the python versions which tsfresh targets into a testing env +FROM ubuntu:22.04 + +SHELL ["/bin/bash", "-c"] + +# These are required to build python from source +RUN apt-get update && apt-get install -y \ + python3-pip \ + curl \ + clang \ + git \ + build-essential \ + libssl-dev \ + libreadline-dev \ + zlib1g-dev \ + libbz2-dev \ + libsqlite3-dev \ + llvm \ + libncurses5-dev \ + libgdbm-dev \ + libnss3-dev \ + libffi-dev \ + liblzma-dev \ + libgmp-dev \ + libmpfr-dev \ + && apt-get clean + + +RUN curl https://pyenv.run | bash + +# For interactive use (if any), this is an edge case. +RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc && \ + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc && \ + echo 'eval "$(pyenv init -)"' >> ~/.bashrc + +ENV PYENV_ROOT="/root/.pyenv" +ENV PATH="$PYENV_ROOT/bin:$PATH" +ENV PATH="$PYENV_ROOT/shims:$PATH" + +ARG PYTHON_VERSIONS +RUN for version in $PYTHON_VERSIONS; do \ + echo Installing $version; \ + # Band aid for https://github.com/pyenv/pyenv/issues/1738 + # since this also appears to apply to 3.7.X + if [[ $version =~ ^3\.7\..*$ ]]; then \ + echo Using clang to compile $version; \ + CC=clang pyenv install $version || exit 1; \ + else \ + pyenv install $version || exit 1; \ + fi; \ + done + +RUN pyenv global $PYTHON_VERSIONS + +RUN pip install tox + +WORKDIR /tsfresh + +# Requires adding safe.directory so that tsfresh can build when the +# repo is mounted. +# Note cannot do this at build time as no git directory exists +CMD ["/bin/bash", "-c", "git config --global --add safe.directory /tsfresh && tox -r -p auto"] diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..0909f3e5 --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +WORKDIR := /tsfresh +TEST_IMAGE := tsfresh-test-image +TEST_DOCKERFILE := Dockerfile.testing +TEST_CONTAINER := tsfresh-test-container +# >= 3.9.2 ---> https://github.com/dask/distributed/issues/7956 +PYTHON_VERSIONS := "3.7.12 3.8.12 3.9.12 3.10.12 3.11.0" +BLACK_VERSION := 22.12.0 +# Isort 5.12.0 not supported with python 3.7.12 +ISORT_VERSION := 5.12.0 + +build-testenv: + docker build \ + -f $(TEST_DOCKERFILE) \ + -t $(TEST_IMAGE) \ + --build-arg PYTHON_VERSIONS=$(PYTHON_VERSIONS) \ + . + +# Tests `PYTHON_VERSIONS`, provided they are also +# specified in setup.cfg `envlist` +test-all-testenv: clean build-testenv + docker run --rm \ + --name $(TEST_CONTAINER) \ + -v .:$(WORKDIR) \ + -v build_artifacts:$(WORKDIR)/build \ + -v tox_artifacts:$(WORKDIR)/.tox \ + -v egg_artifacts:$(WORKDIR)/tsfresh.egg-info \ + $(TEST_IMAGE) + +# Tests the python binaries installed +# on local machine, provided they are also +# specified in setup.cfg `envlist` +test-all-local: clean + tox -r -p auto + +# Tests for python version on local machine in +# current context (e.g. global or local version of +# python set by pyenv, or the python version in +# the active virtualenv). +test-local: clean + pip install .[testing] + pytest + +clean: + rm -rf .tox build/ dist/ *.egg-info + +install-formatters: + pip install black==$(BLACK_VERSION) isort==$(ISORT_VERSION) + +format: install-formatters + black --extend-exclude \.docs . + isort --profile black --skip-glob="docs" . + +.PHONY: clean test-all-local test-local test-all-testenv format install-formatters diff --git a/docs/text/how_to_contribute.rst b/docs/text/how_to_contribute.rst index 0633784f..a5108eec 100644 --- a/docs/text/how_to_contribute.rst +++ b/docs/text/how_to_contribute.rst @@ -64,7 +64,7 @@ you have to: .. code:: - pytest + make test-local To test changes across multiple versions of Python, run: @@ -72,13 +72,24 @@ To test changes across multiple versions of Python, run: .. code:: - tox -r + make test-all-local -`tox -r` will execute tests for the Python versions specified in `setup.cfg `_ using the `envlist` variable. For example, if `envlist` is set to `py37, py38`, the test suite will run for Python 3.7 and 3.8 on the local development platform, assuming the binaries for those versions are available locally. The exact Python microversions (e.g. `3.7.1` vs `3.7.2`) depend on what is installed on the local development machine. +This will execute tests for the Python versions specified in `setup.cfg `_ using the `envlist` variable. For example, if `envlist` is set to `py37, py38`, the test suite will run for Python 3.7 and 3.8 on the local development platform, assuming the binaries for those versions are available locally. The exact Python microversions (e.g. `3.7.1` vs `3.7.2`) depend on what is installed on the local development machine. A recommended way to manage multiple Python versions when testing locally is with `pyenv`, which enables organized installation and switching between versions. +In addition to running tests locally, you can also run them in a Dockerized testing environment: + + +.. code:: + + make test-all-testenv + + +This command will initially take some time. However subsequent invokations will be faster, and testing this way ensures a clean, consistent test environment, regardless of your local setup. + + Documentation '''''''''''''