{ "info": { "author": "Ryan P Kilby", "author_email": "kilbyr@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: tox", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Testing" ], "description": "# tox-factor\n\n[![CircleCI](https://circleci.com/gh/rpkilby/tox-factor.svg?style=shield)](https://circleci.com/gh/rpkilby/tox-factor)\n[![Appveyor](https://ci.appveyor.com/api/projects/status/8yqgrr22dct9rxxg?svg=true)](https://ci.appveyor.com/project/rpkilby/tox-factor)\n[![codecov](https://codecov.io/gh/rpkilby/tox-factor/branch/master/graph/badge.svg)](https://codecov.io/gh/rpkilby/tox-factor)\n[![version](https://img.shields.io/pypi/v/tox-factor.svg)](https://pypi.python.org/pypi/tox-factor)\n[![python](https://img.shields.io/pypi/pyversions/tox-factor.svg)](https://pypi.org/project/tox-factor/)\n[![license](https://img.shields.io/pypi/l/tox-factor.svg)](https://pypi.python.org/pypi/tox-factor)\n\n## What is tox-factor?\n\ntox-factor enables running a subset of tox test envs, based on factor matching.\n\n\n## Okay, but what does that *actually* mean?\n\nTake the following tox config:\n\n```ini\n[tox]\nenvlist =\n py{35,36,37}-django{20,21,22}-{redis,memcached}\n```\n\nThe above defines 18 test envs, based on three factor groups - the python\nversion, the django version, and a caching backend. While the above is powerful,\ntox does not provide a way to run builds based on a subset of those factors.\nFor example, the call to run all Python 3.7 builds would be:\n\n```shell\n$ tox -e py37-django20-redis,py37-django20-memcached,py37-django21-redis,py37-django21-memcached,py37-django22-redis,py37-django22-memcached\n```\n\ntox-factor functions similarly to the `-e ` argument, except it runs\nall envs that match the given factor. The six `py37` builds could be ran with:\n\n```shell\n$ tox -f py37\n```\n\nIn addition to ease of use when running tox locally, this is useful for some CI\nsetups. For example, two common tox CI patterns are to either:\n\n- Define a CI job for each tox test env. e.g.,\n\n `tox -e py37-django20-redis`\n\n- Define a CI job for a common environment that runs multiple test envs. e.g.,\n\n `tox -e py37-django20-redis,py37-django20-memcached,...`\n\nFor the latter case, this plugin eases maintenance of CI, as it could be\nshortened to `tox -f py37`. Additionally, take the following update to the above\ntox config:\n\n```ini\n[tox]\nenvlist =\n py{35,36,37}-django{20,21,22}-{redis,memcached}\n py{36,37,38}-django{30}-{redis,memcached}\n```\n\nBy using tox-factor, it wouldn't be necessary to update the Python 3.7 build, as\nthe new `py37-django30-*` env would be matched automatically.\n\n\n\n## Verifying the matched test envs\n\nIf you want to verify which test envs are actually ran, combine the factor\nmatching with the `-l` flag. This will display all test envs that match. e.g.,\n\n```shell\n$ tox -f py37 -l\npy37-django20-redis\npy37-django20-memcached\npy37-django21-redis\npy37-django21-memcached\npy37-django22-redis\npy37-django22-memcached\n```\n\n\n## Usage details\n\nThe factor option accepts a comma-separated list (similar to the `-e` option).\n```shell\n$ tox -f py27,py37 -l\npy27-django111\npy37-django21\n```\n\nAlternatively, factors can be provided via the `TOXFACTOR` environment variable:\n```shell\n$ TOXFACTOR=py27,py37 tox -l\npy27-django111\npy37-django21\n```\n\nFactors can also match non-generative env names. For example, given the\nfollowing tox config:\n\n```ini\n[tox]\nenvlist =\n py{35,36,37}-django20\n\n[testenv:list]\n```\n\nThen the following would match:\n\n```shell\n$ tox -f py37,lint -l\npy37-django20\nlint\n```\n\nFactors are always superseded by a given `toxenv`. For example, tox-factor would\nnoop in the following cases:\n\n```shell\n$ tox -f py37 -e py35-django21 -l\npy35-django21\n\n$ TOXENV=py35-django21 tox -f py37 -l\npy35-django21\n```\n\nFactors do not support partial matching. `tox -f py3` would not match `py37`.\nHowever, factors may match disparate dash-separated parts. Given the following:\n```ini\n[tox]\nenvlist =\n py{35,36,37}-django{20,21,22}-{redis,memcached}\n```\n\nThen `tox -f py37-redis` would match:\n```\npy37-django20-redis\npy37-django21-redis\npy37-django22-redis\n```\n\n\n## Release Process\n\n- Update changelog\n- Update package version in setup.py\n- Create git tag for version\n- Upload release to PyPI test server\n- Upload release to official PyPI server\n\n```shell\n$ pip install -U pip setuptools wheel twine\n$ rm -rf dist/ build/\n$ python setup.py sdist bdist_wheel\n$ twine upload -r test dist/*\n$ twine upload dist/*\n```\n\n\n## Thanks\n\nThis code is largely based off the work done by @ryanhiebert in [tox-travis][1].\nWithout his efforts, it would have taken significantly more time to write and\ntest this package.\n\n## License\n\nSee: [LICENSE][2]\n\n[1]: https://github.com/tox-dev/tox-travis\n[2]: https://github.com/rpkilby/tox-factor/blob/master/LICENSE\n\nBSD 3-Clause License\n\nCopyright (c) 2019, Ryan P Kilby\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/rpkilby/tox-factor", "keywords": "", "license": "BSD 3-Clause License", "maintainer": "", "maintainer_email": "", "name": "tox-factor", "package_url": "https://pypi.org/project/tox-factor/", "platform": "", "project_url": "https://pypi.org/project/tox-factor/", "project_urls": { "Homepage": "https://github.com/rpkilby/tox-factor", "Source": "https://github.com/rpkilby/tox-factor", "Tracker": "https://github.com/rpkilby/tox-factor/issues" }, "release_url": "https://pypi.org/project/tox-factor/0.1.1/", "requires_dist": [ "tox" ], "requires_python": "", "summary": "Run tox testenvs that match a given factor", "version": "0.1.1" }, "last_serial": 5369904, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "3739c5e87ef8751fcf4deab7c7373121", "sha256": "920390ab1cd976087bcb96daca55b499b0c063bd7c30504a48038c75ca0ccf2f" }, "downloads": -1, "filename": "tox_factor-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3739c5e87ef8751fcf4deab7c7373121", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8183, "upload_time": "2019-04-03T22:29:05", "url": "https://files.pythonhosted.org/packages/ae/b3/c964a5fe34277cd949e47488b876dcfed6c4e4abbfdf4abfb47ab27295f3/tox_factor-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "50ad9b5a890b6074fcf59ce21dbd3b0a", "sha256": "642ba825993d4cc568c3cce8b3f89053a7e465dc0dca1a26a879daaa92498a2e" }, "downloads": -1, "filename": "tox-factor-0.0.1.tar.gz", "has_sig": false, "md5_digest": "50ad9b5a890b6074fcf59ce21dbd3b0a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8791, "upload_time": "2019-04-03T22:29:07", "url": "https://files.pythonhosted.org/packages/16/c9/6e07b6d01af5058d7365a72eb0d284962ce6ec43eb212c97ecfde7a54af8/tox-factor-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "60d94c1890cbbc7c3ec88cf58ec8e1dd", "sha256": "6dc451f191763c83d57eab0e0498ffc033e2556b3fed26f2544db79e7af28226" }, "downloads": -1, "filename": "tox_factor-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "60d94c1890cbbc7c3ec88cf58ec8e1dd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8566, "upload_time": "2019-04-04T03:40:24", "url": "https://files.pythonhosted.org/packages/cf/17/684ec8a33751a8c6bb94f5f2a2660865eac8daa52a054a44b3a63119bbac/tox_factor-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab1ffaacc923bcd94cdd86d304aff53d", "sha256": "02761db5311ef6ce78e881a37699ece40e69ee9a0a0505a5ba22ee992f3c0b60" }, "downloads": -1, "filename": "tox-factor-0.0.2.tar.gz", "has_sig": false, "md5_digest": "ab1ffaacc923bcd94cdd86d304aff53d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9211, "upload_time": "2019-04-04T03:40:25", "url": "https://files.pythonhosted.org/packages/6a/ca/74bfae35cf6b2c75c7c67074553aea699e90f631152cf5f38dc9cf7d5eef/tox-factor-0.0.2.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "d41fc2959c90368cdf532a5df8737fb1", "sha256": "27333da9e9cd1f2cf13463ef3a4967ceba4b1e9893e1140048f37f686fce5fd5" }, "downloads": -1, "filename": "tox_factor-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d41fc2959c90368cdf532a5df8737fb1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8873, "upload_time": "2019-04-24T04:32:41", "url": "https://files.pythonhosted.org/packages/8e/31/c466e3e075f290b021e7c6cb8470afe3d722b95dbef63a1fe5dbdc4dda80/tox_factor-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2a47411e89cfbbe83ff800779dc0bfed", "sha256": "5ea43a8c61eb33f15bc1fc5e64c95c9e47d3dff540b154e798099a761b21b0c0" }, "downloads": -1, "filename": "tox-factor-0.1.0.tar.gz", "has_sig": false, "md5_digest": "2a47411e89cfbbe83ff800779dc0bfed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9750, "upload_time": "2019-04-24T04:32:43", "url": "https://files.pythonhosted.org/packages/25/2c/73ae5810981fd0a35b256ab63fd8fdc261afe6c91181f594346e520e4d63/tox-factor-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "8f18fcd461af6b86fb7a68d380cbcc30", "sha256": "1685243f9653c1f1f957783de749c90076925379390597e056378aa4ad34eb64" }, "downloads": -1, "filename": "tox_factor-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8f18fcd461af6b86fb7a68d380cbcc30", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8984, "upload_time": "2019-06-07T02:54:26", "url": "https://files.pythonhosted.org/packages/75/23/015dd5581cae82bab4e0f60c271d72172efe13913af0f8745e0fa1450b18/tox_factor-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d036d945e95d97031eb9a5e80cb2513e", "sha256": "ce4924e37eb34088f1b1e1a6d425309c1b7c64d57092231ea7eb65b5b1488d66" }, "downloads": -1, "filename": "tox-factor-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d036d945e95d97031eb9a5e80cb2513e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9866, "upload_time": "2019-06-07T02:54:28", "url": "https://files.pythonhosted.org/packages/3f/04/12e03a24419779cb61a2c7df206f080d9e34db031165ba43f6511a010ea6/tox-factor-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8f18fcd461af6b86fb7a68d380cbcc30", "sha256": "1685243f9653c1f1f957783de749c90076925379390597e056378aa4ad34eb64" }, "downloads": -1, "filename": "tox_factor-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8f18fcd461af6b86fb7a68d380cbcc30", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8984, "upload_time": "2019-06-07T02:54:26", "url": "https://files.pythonhosted.org/packages/75/23/015dd5581cae82bab4e0f60c271d72172efe13913af0f8745e0fa1450b18/tox_factor-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d036d945e95d97031eb9a5e80cb2513e", "sha256": "ce4924e37eb34088f1b1e1a6d425309c1b7c64d57092231ea7eb65b5b1488d66" }, "downloads": -1, "filename": "tox-factor-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d036d945e95d97031eb9a5e80cb2513e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9866, "upload_time": "2019-06-07T02:54:28", "url": "https://files.pythonhosted.org/packages/3f/04/12e03a24419779cb61a2c7df206f080d9e34db031165ba43f6511a010ea6/tox-factor-0.1.1.tar.gz" } ] }