{ "info": { "author": "Lennart Regebro", "author_email": "regebro@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Testing" ], "description": "Spiny\n=====\n\nSpiny Norman is a Hedgehog.\n\nIt's also a package that will run your Python tests under multiple versions\nof Python.\n\n\"Hey hang on!\" I hear you say, \"There's already Tox!\" And you are right.\nSpiny is my attempt to look into the problem space tox covers to make\nsomething that is less complex, and fixes a couple of problems with Tox.\n\nMost notably, with Spiny, Python does not have to be on the path, it can\ninstall versions of Python other than the one your installed version of\nvirtualenv happens to support, and it does not always call setup.py.\nIt also will run the tests in parallel.\n\nMajor feature: For the common use case it needs no configuration.\n\nThere is no guarantee that Spiny's features will not end up in Tox.\n\n\nCommand line parameters\n-----------------------\n\nYou run Spiny from the root of the Python project that you want to test,\nie the direectory that has the ``setup.py`` file.\n\nThe command line parameters are:\n\n usage: spiny [-h] [--version] [-c ] [-e ] [-v] [-q]\n [ [ ...]]\n\n Run tests under several Python versions.\n\n positional arguments:\n Override a config variable by \"section:variable=value\"\n Example: \"spiny:venv-dir=.venv\"\n\n optional arguments:\n -h, --help Show this help message and exit.\n --version Show the version and exit.\n -c , --config \n The config file to use. Defaults \"to spiny.cfg\".\n -e , --envlist \n A list of environments to run, separated by commas.\n -v, --verbose Increases the output, -vv increases it even more.\n -q, --quiet Reduces output to only the run summary, -qq removes\n also that.\n\n\nVersion support\n---------------\n\nSpiny can be run under Python 2.6, 2.7, 3.3 and 3.4. It can also be run under\nPyPy, PyPy3 and Jython.\n\nIt can run tests under a much wider range of Python versions, this has been tested\nwith Python 2.4, 2.5, 3.1 and 3.2 in addition to the above Python versions.\n\nIronPython is supported in theory, but I can't get virtualenv working with\nIronPython. Other Python implementations are not tested. If one doesn't work,\nyou are welcome to raise an issue and I can look into it.\n\n\nConfiguration files\n-------------------\n\nSpiny does not typically need a configuration file. It will instead look at\nyour ``setup.py`` and find out what Python versions you module supports, and\nrun the tests with those versions.\n\nYou declare version support with classifiers, like this::\n\n setup(\n ...\n classifiers=[\n ...\n \"Programming Language :: Python\",\n \"Programming Language :: Python :: 2.6\",\n \"Programming Language :: Python :: 2.7\",\n \"Programming Language :: Python :: 3.3\",\n \"Programming Language :: Python :: 3.4\",\n \"Programming Language :: Python :: Implementation :: PyPy\",\n ...\n ],\n ...\n )\n\nWith these classifiers, Spiny will run the tests under Python 2.6, 2.7, 3.3,\n3.4 and also under PyPy.\n\nYou can configure Spiny explicitly on a configuration basis. You can add a\n``spiny.cfg`` located in the project root, or you can add the configuration\nto the projects ``setup.cfg``.\n\nYou can also have a personal configuration file in ``~/.config/spiny.cfg``\nwhose configuration options will be valid for all projects.\n\nUnder the ``[spiny]`` section the\nfollowing configuration options are supported:\n\n * **environments**: A whitespace separated list of Python and Python versions.\n\n * **venv-dir**: The name of the directory to install virtualenvs in.\n Defaults to ``.venv``.\n\n * **max-processes**: The maxiumum of concurrent processes to run tests with.\n Defaults to the number of CPU's you have.\n\n * **test-commands**: The commands used to run the tests. You can have\n several lines of commands. Defaults to ``{envpython} setup.py test``. There\n are a few variables that you can use in the commands that will be replaced:\n\n * ``{envpython}`` will be replaced with the full path to the Python\n executable in the virtualenv\n\n * ``{basepython}`` will be replaced with the full path to the Python\n executable the virtualenv is created from\n\n * ``{envdir}`` will be replaced with the full path to the virtualenv\n directory.\n\n * ``{projectdir}`` will be replaced with the full path to the directory\n of the Python project (ie, the current directory)\n\n * **setup-commands**: The commands used to create the virtualenv. The default\n for this varies, but it boils down to ``{envpython} -m virtualenv {envdir}``.\n\n * **use-setup-py**: If requirements data from ``setup.py`` should be used to\n gather requirements. This means ``setup.py`` needs to exist, and be\n executable without side-effects. Defaults to ``true``.\n\n * **use-requirements-txt**: If requirements data from ``requiremenets.txt``\n should be used to gather requirements. Defaults to ``true``.\n\n * **changedir**: A directory to change to before running the tests.\n Variables from test-commands are usable.\n\n\nExample::\n\n [spiny]\n environments = python2.7\n python3.4\n pypy2.4\n\n venv-dir = .venv\n\n test-commands = {envpython} something.py magic\n {envpython} setup.py test\n\n max-processes = 3\n\nThere is also a ``[pythons]`` section, which defines up the paths to the various\nexecutables, per environment::\n\n [pythons]\n python2.6 = /pythons/python26/bin/python\n python2.7 = /pythons/python27/bin/python\n python3.3 = /pythons/python33/bin/python3\n python3.4 = /pythons/python34/bin/python3\n\nIf you don't configure this, the executables that are on the PATH will be used.\n\nThis doesn't make much sense to have in the projects ``spiny.cfg``,\nas each person who runs the tests are likely to have differing Python installs.\nHowever, this does make a lot of sense to have in the personal configuration file.\n\nYou can add the ``[pythons]`` section in your projects ``spiny.cfg``, but the\nusecase for that is very limited. Possibly if you are using custom Pythons in\nyour project.\n\n``max-processes`` also is reasonable in your personal file, if you for\nexample have very long-running tests, and you want to keep a CPU free, for\nexample for browing the web while the tests run. It also makes sense in a\nproject file if your tests use a lot of memory, to avoid running out of\nmemory.\n\n``environments`` and ``test-commands`` only make sense per configuration and\nnot in the personal file. However, no checks for this are done, so you can\nadd them there if you want to, but the results are unlikely to be practical.\n\n\nTodo\n----\n\nThings that needs doing:\n\n * Make the tests run under itself.\n\n * Figure out how to run coverage on things run by subprocesses.\n\n * Add commands per environment, enabling things like a pep8 environment\n that checks for pep8 compliance, etc.\n\n * Windows support. Maybe.\n\n\nCHANGES\n=======\n\n0.6 (2017-04-12)\n----------------\n\n- Using /dev/null as stdin means the tests doesn't hang, but errors out.\n\n- No redirection of test output (or input) when only using one process.\n\n- It's not a library, so supporting Python 2 isn't needed.\n\n\n0.5 (2016-02-26)\n----------------\n\n- CTRL-C will now kill the program.\n\n- Renamed {envpath} to {envdir}, {python} to {envpython} and {project_dir} to\n {projectdir}. Also added {basepython} to the Python version used to install\n the virtual env.\n\n- Various changes to make custom commands more stable and flexible.\n\n- Added a changedir option to the config.\n\n- You can now run tests for Pythons that does not support any version\n of virtualenv, such as Python 2.3 and earlier.\n\n- Gives a nice error message and exits with -1 if it doesn't know what\n versions to use.\n\n- Dropped support for running Spiny with Python 2.6.\n\n- If using a system Python 3 the virtualenv will no longer install system\n Python 2.\n\n- Spiny now supports having different requirements in setup.py for different\n versions of Python.\n\n- Not finding an executable for a specific environment is no longer a fatal\n error, so you don't have to have all the supported versions installed.\n\n\n0.4 (2014-11-01)\n----------------\n\n- Added support for requirements.txt.\n\n- Added parameters to skip executing setup.py.\n\n- Added a setup-commands parameter to override how the virtualenv is made.\n\n- The -e parameter now actually works.\n\n- The information about the python execs is now cached. This speeds up\n startup, a lot, fetching the Python environments goes from around 5\n seconds to less than a tenth.\n\n- A profile of each virtualenv is now saved in the virtualenv, containing\n it's name, the full path of the Python exe, and the installed requirements.\n A virtualenv will now only be updated if this has changed since the last run.\n This also speeds up tests runs a lot in the typical case.\n\n\n0.3 (2014-10-30)\n----------------\n\n- Now runs under Python 3, PyPy, PyPy3, Jython.\n\n- All output is now through logging, which enables you to select verbosity.\n\n- Added --version, --verbose and --quiet options.\n\n- Now use subprocess32 under Python 2.\n\n- Will now run tests in parallell with multiprocessing. A 'max-processes'\n option in the [spiny] section will allow you to cap the processes if\n you don't want to max your computer. Otherwise it will use as many processes\n as multiprocessing will report cpu's.\n\n\n0.2 (2014-10-27)\n----------------\n\n- Now prints a summary in the end.\n\n- Regard more virtualenv tests as failures.\n\n- Return 1 if not all tests succeeded.\n\n- Fall back to setup.cfg is there is no spiny config file.\n\n- Renamed spiny.conf to spiny.cfg for consistency.\n\n- Made the configuration file optional.\n\n- Spiny will now grep setup.py for Python version classifiers if no\n environment configuration is found.\n\n- If both Python X and Python X.Y is given as environments, it will\n skip the tests for Python X, seeing as it is fulfilled by Python X.Y.\n\n- The version specified in the [pythons] section now have preference.\n\n- Setting a config option from the command line now works even if the section\n doesn't exist.\n\n- Spiny will now attempt to extract the test requirements and install them\n into the virtualenv before running the tests, to avoid polluting the\n project directory with .egg directories.\n\n\n0.1.1 (2014-10-18)\n------------------\n\n- Initial release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/regebro/spiny/", "keywords": "development,tools,testing", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "spiny", "package_url": "https://pypi.org/project/spiny/", "platform": "", "project_url": "https://pypi.org/project/spiny/", "project_urls": { "Homepage": "https://github.com/regebro/spiny/" }, "release_url": "https://pypi.org/project/spiny/0.6/", "requires_dist": null, "requires_python": "", "summary": "Spiny will run your Python tests under multiple versions of Python", "version": "0.6" }, "last_serial": 2799975, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "b55764f13ed5b00d8bf5a6bfa599f6bc", "sha256": "b77ee4b424e8ebb4d6f4f7244130297a5f0785b3623bd190e64336662436cf16" }, "downloads": -1, "filename": "spiny-0.1.zip", "has_sig": false, "md5_digest": "b55764f13ed5b00d8bf5a6bfa599f6bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11929, "upload_time": "2014-10-18T08:47:41", "url": "https://files.pythonhosted.org/packages/21/17/bcb0379b358966d8dd70b0bac875a52023bddf297decec6d9fe06cd283f6/spiny-0.1.zip" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "86a5c97cdcdbcd314a9d69854eb655c6", "sha256": "258927750c8d68c9907c17522b744da537ed93237b73a7b50c48542b8026a020" }, "downloads": -1, "filename": "spiny-0.1.1.zip", "has_sig": false, "md5_digest": "86a5c97cdcdbcd314a9d69854eb655c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14290, "upload_time": "2014-10-18T10:01:18", "url": "https://files.pythonhosted.org/packages/8e/e1/4c069ccd603689c0b66e2d96e8455a4daac22cf828fb7af84f2a247545d8/spiny-0.1.1.zip" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "5b34e1ff1d2b31558dfe1e7dc3f0ed41", "sha256": "8e418d52ff4374e510b5dd77cefd5687603d29e1e848a3411b487b8f81d6930b" }, "downloads": -1, "filename": "spiny-0.2.zip", "has_sig": false, "md5_digest": "5b34e1ff1d2b31558dfe1e7dc3f0ed41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17715, "upload_time": "2014-10-27T21:09:45", "url": "https://files.pythonhosted.org/packages/53/be/f1fc7b9cbe337629f50a02529797db22cdf63bfb2f5d9dd4254fdc870add/spiny-0.2.zip" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "2c235e6e88646cdfbf2c20e4d884adf9", "sha256": "7b5980b407c2add0e9add1994a72a0462e470c92e8de33658d88bdc48ed7f28a" }, "downloads": -1, "filename": "spiny-0.3.zip", "has_sig": false, "md5_digest": "2c235e6e88646cdfbf2c20e4d884adf9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24144, "upload_time": "2014-10-30T13:05:41", "url": "https://files.pythonhosted.org/packages/08/70/dfd7e4d7f6bef992969abffbcf5bc7c7a0bf8d6d1ed66e350bac4d75066b/spiny-0.3.zip" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "48971dc5a00cb7c76943a146d134bde9", "sha256": "5d712ec3f66c0e83fb3260361b2b4ed78ca537826ed80d460c738e9e173afe7e" }, "downloads": -1, "filename": "spiny-0.4.zip", "has_sig": false, "md5_digest": "48971dc5a00cb7c76943a146d134bde9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26394, "upload_time": "2014-11-01T20:42:54", "url": "https://files.pythonhosted.org/packages/2b/b2/21872ec27ac89e20cbd91ae52166e72738f2f8039c8d6185504a77df67ee/spiny-0.4.zip" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "94149e10e12e0b36684dc0dbc45a7005", "sha256": "17af0afe94a822fb2c31ebb01e311c9abcc0e99859dfde89f7c7a1a05803d99e" }, "downloads": -1, "filename": "spiny-0.5.zip", "has_sig": false, "md5_digest": "94149e10e12e0b36684dc0dbc45a7005", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28648, "upload_time": "2016-02-27T02:08:35", "url": "https://files.pythonhosted.org/packages/40/c7/3446dd93bb2ce7976527def0501111af07e332b30406fc2808749476a33b/spiny-0.5.zip" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "52e63c5804e6477afa7e5d00baae7b73", "sha256": "0f76aac20432fb4b11a7dbbf9020ea795fb172e24132c5ade4a4eb6292408148" }, "downloads": -1, "filename": "spiny-0.6.tar.gz", "has_sig": false, "md5_digest": "52e63c5804e6477afa7e5d00baae7b73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16396, "upload_time": "2017-04-12T19:59:16", "url": "https://files.pythonhosted.org/packages/ad/1f/228bdd24ba9b750b82e0fe225623daab41e1b70c659798554caeebc05f7d/spiny-0.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "52e63c5804e6477afa7e5d00baae7b73", "sha256": "0f76aac20432fb4b11a7dbbf9020ea795fb172e24132c5ade4a4eb6292408148" }, "downloads": -1, "filename": "spiny-0.6.tar.gz", "has_sig": false, "md5_digest": "52e63c5804e6477afa7e5d00baae7b73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16396, "upload_time": "2017-04-12T19:59:16", "url": "https://files.pythonhosted.org/packages/ad/1f/228bdd24ba9b750b82e0fe225623daab41e1b70c659798554caeebc05f7d/spiny-0.6.tar.gz" } ] }