tox-factor

Run tox testenvs that match a given factor


Keywords
python, testing, tox
License
BSD-1-Clause
Install
pip install tox-factor==0.1.2

Documentation

tox-factor

CircleCI Appveyor codecov version python license

What is tox-factor?

tox-factor enables running a subset of tox test envs, based on factor matching.

Okay, but what does that actually mean?

Take the following tox config:

[tox]
envlist =
    py{35,36,37}-django{20,21,22}-{redis,memcached}

The above defines 18 test envs, based on three factor groups - the python version, the django version, and a caching backend. While the above is powerful, tox does not provide a way to run builds based on a subset of those factors. For example, the call to run all Python 3.7 builds would be:

$ tox -e py37-django20-redis,py37-django20-memcached,py37-django21-redis,py37-django21-memcached,py37-django22-redis,py37-django22-memcached

tox-factor functions similarly to the -e <env name> argument, except it runs all envs that match the given factor. The six py37 builds could be ran with:

$ tox -f py37

In addition to ease of use when running tox locally, this is useful for some CI setups. For example, two common tox CI patterns are to either:

  • Define a CI job for each tox test env. e.g.,

    tox -e py37-django20-redis

  • Define a CI job for a common environment that runs multiple test envs. e.g.,

    tox -e py37-django20-redis,py37-django20-memcached,...

For the latter case, this plugin eases maintenance of CI, as it could be shortened to tox -f py37. Additionally, take the following update to the above tox config:

[tox]
envlist =
    py{35,36,37}-django{20,21,22}-{redis,memcached}
    py{36,37,38}-django{30}-{redis,memcached}

By using tox-factor, it wouldn't be necessary to update the Python 3.7 build, as the new py37-django30-* env would be matched automatically.

Verifying the matched test envs

If you want to verify which test envs are actually ran, combine the factor matching with the -l flag. This will display all test envs that match. e.g.,

$ tox -f py37 -l
py37-django20-redis
py37-django20-memcached
py37-django21-redis
py37-django21-memcached
py37-django22-redis
py37-django22-memcached

Usage details

The factor option accepts a comma-separated list (similar to the -e option).

$ tox -f py27,py37 -l
py27-django111
py37-django21

Alternatively, factors can be provided via the TOXFACTOR environment variable:

$ TOXFACTOR=py27,py37 tox -l
py27-django111
py37-django21

Factors can also match non-generative env names. For example, given the following tox config:

[tox]
envlist =
    py{35,36,37}-django20

[testenv:list]

Then the following would match:

$ tox -f py37,lint -l
py37-django20
lint

Factors are always superseded by a given toxenv. For example, tox-factor would noop in the following cases:

$ tox -f py37 -e py35-django21 -l
py35-django21

$ TOXENV=py35-django21 tox -f py37 -l
py35-django21

Factors do not support partial matching. tox -f py3 would not match py37. However, factors may match disparate dash-separated parts. Given the following:

[tox]
envlist =
    py{35,36,37}-django{20,21,22}-{redis,memcached}

Then tox -f py37-redis would match:

py37-django20-redis
py37-django21-redis
py37-django22-redis

Release Process

  • Update changelog
  • Update package version in setup.py
  • Create git tag for version
  • Upload release to PyPI test server
  • Upload release to official PyPI server
$ pip install -U pip setuptools wheel twine
$ rm -rf dist/ build/
$ python setup.py sdist bdist_wheel
$ twine upload -r test dist/*
$ twine upload dist/*

Thanks

This code is largely based off the work done by @ryanhiebert in tox-travis. Without his efforts, it would have taken significantly more time to write and test this package.

License

See: LICENSE