Blob Blame History Raw
#!/bin/sh -eux

# set default version to %{python3_version} if available
VERSION=${VERSION:-$(rpm --eval '%{?python3_version}')} || true
# ...or 3.8 if that macro is not available or rpm fails for any reason
VERSION=${VERSION:-3.8}

PYTHON=${PYTHON:-python$VERSION}
METHOD=${METHOD:-venv}
TOX=${TOX:-true}
TOX_REQUIRES=${TOX_REQUIRES:-}
CYTHON=${CYTHON:-true}
INSTALL_OR_SKIP=${INSTALL_OR_SKIP:-false}

# Work from a custom directory
workdir="$(mktemp --directory)"
cd "$workdir"

if [ "$INSTALL_OR_SKIP" == "true" ]; then
  [ ! -f "/usr/bin/$PYTHON" ] && dnf -y install "/usr/bin/$PYTHON" || :
  dnf -y install "$PYTHON-devel" || :
  if [ ! -f "/usr/bin/$PYTHON" ]; then
    echo "/usr/bin/$PYTHON not installable, skipping this test"
    exit 0
  fi
fi

# check the we can create the venv
if [ "$METHOD" == "venv" ]; then
  $PYTHON -m venv venv
elif [ "$METHOD" == "virtualenv" ]; then
  virtualenv --python=$PYTHON venv
elif [ "$METHOD" == "virtualenv-download" ]; then
  virtualenv --download --python=$PYTHON venv
elif [ "$METHOD" == "virtualenv-no-download" ]; then
  virtualenv --no-download --python=$PYTHON venv
elif [ "$METHOD" == "virtualenv-seeder-pip" ]; then
  virtualenv --seeder pip --python=$PYTHON venv
elif [ "$METHOD" == "none" ]; then
  echo 'Skipping plain virtual environment tests' >&2
else
  echo 'Unsupported $METHOD' $METHOD >&2
exit 1
fi

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

if [ "$METHOD" != "none" ]; then

# 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/t}

# install packages with pip
python -m pip install pytest

# run tests
python -m pytest -v test_foo.py

if [ "$CYTHON" == "true" ]; 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 > pyproject.toml << EOF
[build-system]
requires = ["setuptools", "cython"]
build-backend = "setuptools.build_meta"
EOF

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

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

python -m pip install .

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

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

fi # METHOD != none

# ensurepip test (when testing virtualenv, this was not covered)
# with the main Python, this will say "Requirement already satisfied", but that's OK
$PYTHON -m ensurepip --root ensurepiptestroot

# use it with tox
[[ "$TOX" != "true" ]] && exit 0
if [[ $PYTHON == python* ]]; then
    export TOXENV=py${VERSION/./}
elif [[ $PYTHON == pypy* ]]; then
    export TOXENV=pypy${VERSION/./}
else
    export TOXENV=$PYTHON
fi

echo '[tox]' > tox.ini
if [ -n "$TOX_REQUIRES" ]; then
    echo 'requires = '"$TOX_REQUIRES" >> tox.ini
fi
cat >> tox.ini << EOF
skipsdist = True
[testenv]
commands = python -c 'import sys; print(sys.version)'
EOF

# Tests that the Python version used in tox is really the Python version we want
tox | tee toxlog
grep "^${VERSION/t}\.[0-9]" toxlog

echo '[tox]' > tox.ini
if [ -n "$TOX_REQUIRES" ]; then
    echo 'requires = '"$TOX_REQUIRES" >> tox.ini
fi
cat >> tox.ini << EOF
skipsdist = True
[testenv]
deps = pytest
commands = python -m pytest -v test_foo.py
EOF

# A more complex example with pytest
tox

# Clean up if everything else went well
cd -
rm -rf "$workdir"