{ "info": { "author": "Andrew Alcock, Aviser LLP, Singapore", "author_email": "dovetail@aviser.asia", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Topic :: Software Development :: Build Tools" ], "description": "Introducing Dovetail\n====================\n\nDovetail is a light-weight, multi-platform build tool for Python with\nContinuous Integration servers like Jenkins in mind.\n\n-----\n\n **TL;DR**\n\n Builds are complex, integrate many tools and sometimes must run on\n many platforms. Writing good build scripts is hard.\n\n Dovetail helps in all these areas, and is not a rip'n'replace for your\n existing tools. You can readily automate a build using Dovetail.\n\n-----\n\nBuilding an application is not just running::\n\n > python setup.py sdist\n\nWhat about:\n\n * Building binary distributions *for several target platforms*\n * Building the user documentation *and* the API docs?\n * Running your unit tests, sometimes using several test frameworks?\n * Installing your application in a clean virtual environment and running\n user tests?\n * Running code quality tools like\n `Coverage `_ and\n `Pylint `_?\n * Tagging your code in your DVCS?\n * Uploading the artifacts to a repository? That's probably at least an Egg,\n a source distribution, documentation and your web site\n\n**How can you guarantee everyone, especially the new team members, are\nbuilding in the same way?**\n\nMany teams solve this by writing scripts, but that raises more questions:\n\n * Do you have a *lot of scripts* lying around, each doing their\n own thing, and little shared code?\n * Do you have *operating system specific scripts* that do the same\n thing, but on different operating systems?\n * Are your scripts *reliable* and *maintainable*?\n\nIf you need to improve in these areas, **Dovetail can help**. Dovetail:\n\n * Is **pure Python**, so the build runs everywhere and is maintainable\n * Provides a **simple API** to externalize many common build\n requirements\n * There are **no new configuration file formats** or 4GLs of abstruse XML\n or other syntaxes\n * Makes it simple to **query the build environment** and adjust\n the build appropriately\n * **Audits all the build steps and decisions**\n * Properly **catches build errors** and displays the details of what went wrong\n * Makes it terribly easy to **automate the build** in a tool like\n `Jenkins `_.\n\nA nice unexpected benefit for the maintainer was that it has become easier\nto build in my IDE; I also get precisely the same build from the command line.\n\nDovetail does not replace `Setuptools `_\nor `distutils `_ -\nthese are the perfect tools for the specific build step of creating a distributable\npackage.\n\nFunctionality\n-------------\n\nA Dovetail build script is *a standard Python script*. Functions are declared to\nbe *tasks* in the build by decorating them. Further decorators declare:\n\n * *Task dependencies*, with the same build script or across related files\n * *Required packages*, which are downloaded and installed if not present\n * *Conditions*, such as tests on environment variables or the file system.\n * Build *directory structure*\n * *Error conditions*, such as a non-zero return or output in stderr.\n\nDovetail works with numerous other tools to automate build steps, and has built-in\nintegration with `Virtualenv `_. Any build can\nbe run in either the Python version on the path, or any nominated virtual environment.\n\nDovetail installs packages as required, even in the middle of a build. This means that\nyou run a simple task in a complex build without installing all the documentation\nand test packages.\n\nExample\n-------\n\nA trivial example of a Dovetail build script is given below. It uses\n`Sphinx `_ to build the project documentation::\n\n from dovetail import task, requires, check_result, call, mkdirs, do_if, IsDir\n from os import path\n from shutil import rmtree\n\n DOCSOURCE = path.abspath(path.join(path.dirname(__file__), \"source\"))\n BUILD = path.abspath(path.join(path.dirname(__file__), \"..\", \"build\"))\n\n @task # Declares the function clean() is a build task\n @do_if(IsDir(BUILD)) # Only run if the build directory exists\n def clean():\n \"\"\"Clean the project of all build artifacts\"\"\"\n rmtree(BUILD)\n\n @task # Declares the function clean() is a build task\n @requires('sphinx') # Ensures the sphinx package is installed\n @mkdirs(BUILD) # Make the build directory if it doesn't exist\n @check_result # Fails the build if sphinx fails\n def doc():\n \"\"\"Builds the Sphinx User documentation\"\"\"\n return call(\"sphinx-build {0} {1}\".format(DOCSOURCE, BUILD).split(' '))\n\nBuilds are run simply from the OS command line::\n\n $ dovetail clean doc", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://www.aviser.asia/dovetail", "keywords": "build,continuous integration,ci", "license": "GPLv3+", "maintainer": null, "maintainer_email": null, "name": "Dovetail", "package_url": "https://pypi.org/project/Dovetail/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/Dovetail/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://www.aviser.asia/dovetail" }, "release_url": "https://pypi.org/project/Dovetail/1.0beta3/", "requires_dist": null, "requires_python": null, "summary": "A light-weight, multi-platform, build tool for Python with Continuous Integration servers like Jenkins in mind.", "version": "1.0beta3" }, "last_serial": 784160, "releases": { "1.0beta": [ { "comment_text": "", "digests": { "md5": "5b66bcbd2a792e51059f7e6ba8246e4e", "sha256": "6a772e4975d79a1b51abdd8315be4dfa10ccbbf3f27e476262915a27b83d5d97" }, "downloads": -1, "filename": "Dovetail-1.0beta-py2.7.egg", "has_sig": false, "md5_digest": "5b66bcbd2a792e51059f7e6ba8246e4e", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 195513, "upload_time": "2012-08-02T06:03:12", "url": "https://files.pythonhosted.org/packages/b7/4a/69f94e927d8345d3ca0c34835407cbe5fadbd7ea2c463fb82f8ce80e1714/Dovetail-1.0beta-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "2c684156188fdf6876f3a581e818bdc4", "sha256": "5423538e91f2bd11e8b88e27faa73291ad1cbd203e1fba0538c97194423aaf82" }, "downloads": -1, "filename": "Dovetail-1.0beta.tar.gz", "has_sig": false, "md5_digest": "2c684156188fdf6876f3a581e818bdc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64951, "upload_time": "2012-08-02T06:03:22", "url": "https://files.pythonhosted.org/packages/97/9d/eda2f4eac52d89a1c10b5358e53ed317ff05fce6c5c3dc81a00535c168f3/Dovetail-1.0beta.tar.gz" } ], "1.0beta2": [ { "comment_text": "", "digests": { "md5": "fa93586ea6d1cd587288491fa8de130b", "sha256": "8548db870485d7cfe601f2fb7b8513c1a60412b7b6e0404cbdc91a9a0ed4f8bf" }, "downloads": -1, "filename": "Dovetail-1.0beta2-py2.7.egg", "has_sig": false, "md5_digest": "fa93586ea6d1cd587288491fa8de130b", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 197497, "upload_time": "2012-08-14T08:23:50", "url": "https://files.pythonhosted.org/packages/52/26/494923cb7ab596b0d3b63ebc935186799902b52933a524a9bc1a3c5e6d4d/Dovetail-1.0beta2-py2.7.egg" }, { "comment_text": "", "digests": { "md5": "9766f88580ded4cdc0ccee592ea842a7", "sha256": "5c2324257f482d9a3b6499c653e26a57ab1aafebee9cd120cf88587d2a539195" }, "downloads": -1, "filename": "Dovetail-1.0beta2.tar.gz", "has_sig": false, "md5_digest": "9766f88580ded4cdc0ccee592ea842a7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66407, "upload_time": "2012-08-14T08:26:46", "url": "https://files.pythonhosted.org/packages/e5/a3/a26489d68f45e9dd38d4b075ac4dde33a92b7b22f2ebe9df9a090440c1eb/Dovetail-1.0beta2.tar.gz" } ], "1.0beta3": [ { "comment_text": "", "digests": { "md5": "6bbf583a62e821e348dbc595353ae9cf", "sha256": "91c5f93db6b1f01f6a4d26100b00ec93eea60f55916c35a06479927ebc1d48e2" }, "downloads": -1, "filename": "Dovetail-1.0beta3-py2.7.egg", "has_sig": false, "md5_digest": "6bbf583a62e821e348dbc595353ae9cf", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 197540, "upload_time": "2012-08-19T08:23:05", "url": "https://files.pythonhosted.org/packages/a3/44/4b2aa2fda168626ae7b4a56d0c2c1696c27267ee0574f72ccdb9ddd6f53b/Dovetail-1.0beta3-py2.7.egg" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6bbf583a62e821e348dbc595353ae9cf", "sha256": "91c5f93db6b1f01f6a4d26100b00ec93eea60f55916c35a06479927ebc1d48e2" }, "downloads": -1, "filename": "Dovetail-1.0beta3-py2.7.egg", "has_sig": false, "md5_digest": "6bbf583a62e821e348dbc595353ae9cf", "packagetype": "bdist_egg", "python_version": "2.7", "requires_python": null, "size": 197540, "upload_time": "2012-08-19T08:23:05", "url": "https://files.pythonhosted.org/packages/a3/44/4b2aa2fda168626ae7b4a56d0c2c1696c27267ee0574f72ccdb9ddd6f53b/Dovetail-1.0beta3-py2.7.egg" } ] }