churchyard / tests / python

Forked from tests/python 5 years ago
Clone
Blob Blame History Raw
#!/bin/sh -eux

# set python version
VERSION=${VERSION:-3.7}
PYTHON=${PYTHON:-python$VERSION}
METHOD=${METHOD:-venv}
TOX=${TOX:-true}

# clean from possible older runs
rm -rf venv .tox __pycache__ .pytest* test_*.py *.pyx *.c *.so || :

# check the we can create the venv
if [ "$METHOD" == "venv" ]; then
  $PYTHON -m venv venv
elif [ "$METHOD" == "virtualenv" ]; then
  virtualenv --python=$PYTHON venv
else
  echo 'Unsupported $METHOD' $METHOD >&2
exit 1
fi


# and activate it
# unset variables on 3.5, it's known
set +u
source venv/bin/activate
set -u

# run python in it
python -c 'import sys; print(sys.version)' | head -n1 | grep $VERSION

# install packages with pip
if [ "$VERSION" == "2.6" ]; then
    pip install pytest
    pip install Cython --install-option="--no-cython-compile"
else
    python -m pip install pytest
    if [ "$VERSION" == "3.8" ]; then
        # Cython support for 3.8.0a4+ is not yet released
        python -m pip install https://github.com/cython/cython/archive/master.tar.gz --install-option="--no-cython-compile"
    elif [ "$PYTHON" != "jython" ]; then
        # We try to fetch a wheel only and if that fails, we disable compilation
        # Useful for fresh CPythons, where wheels are not yet ready, but Cython defaults to compiling
        python -m pip install Cython --only-binary :all: || python -m pip install Cython --install-option="--no-cython-compile"
    fi
fi

# run tests
cat > test_foo.py << EOF
def test_foo():
    assert True
EOF

python -m pytest -v test_foo.py

# check that we can do extension modules
if [ "$PYTHON" != "jython" ]; then
cat > module.pyx << EOF
cdef int add(int a, int b):
    return a + b

def two():
    cdef int a = 1
    cdef int b = 1
    return add(a, b)
EOF

cat > setup.py << EOF
from setuptools import setup
from Cython.Build import cythonize

setup(ext_modules = cythonize('module.pyx'))
EOF

python setup.py build_ext --inplace

python -c 'import module; print(module.two())' | grep '^2$'
fi

# deactivate has unset variable, it's known
set +u
deactivate
set -u

# use it with tox
[[ "$TOX" != "true" ]] && exit 0
cat > tox.ini << EOF
[tox]
skipsdist = True
[testenv]
deps = pytest
commands = python -m pytest -v test_foo.py
EOF

if [[ $PYTHON == python* ]]; then
    tox -e py${VERSION/./}
else
    tox -e $PYTHON
fi