{ "info": { "author": "John Weachock", "author_email": "jweachock@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "Bumpy\n=====\n\n**Simplify repetitive project tasks with Python.**\n\nBumpy aims to provide a simple and effective way to collect and automate\nbuild, test, and deploy tasks. In order to leverage Python's powerful\nsyntax while still maintaining a minimal and readable build file, Bumpy\nincludes several helper functions to reduce the amount of code and\nclutter your build files need to include without sacrificing\nfunctionality. In addition, Bumpy requires only built-in Python\nlibraries - that means no external dependencies!\n\nBumpy is derived from `pynt `_, and by\nextension, `microbuild `_.\n\nUsage\n-----\n\nBumpy is simple to use. Just open a ``bum.py`` file, define your tasks,\nand run ``bump`` in the same directory.\n\n::\n\n import bumpy as b\n\n @b.task\n def build():\n '''Builds ALL THE CODE.'''\n print 'Building'\n\n::\n\n $ bump build\n Building\n\nAPI\n~~~\n\nBumpy provides a simple function decorator to register and track your\ntasks, as well as several helper functions to make your life easier when\ninterfacing with shell commands and files.\n\nTasks\n^^^^^\n\nIn order to convert your lovely functions into a Bumpy task, it's as\nsimple as applying the ``@task`` decorator:\n\n::\n\n import bumpy as b\n\n @b.task\n def build():\n '''Builds ALL THE CODE.'''\n print 'Building'\n\nThe function name will be used as the task name. The docstring will be\nsaved and used for the built-in help. Any arguments or keyword arguments\nwill be parsed and registered as CLI flags.\n\n--------------\n\nPrerequisite tasks / files can be specified with an optional ``reqs``\nkeyword argument to ``@task``:\n\n::\n\n @b.task(reqs=build)\n def run():\n print 'Running'\n\n``reqs`` can be a single requirement or a tuple of requirements. A\ndependency will only be executed the first time it's required, although\nit may be explicitly executed multiple times via the command line:\n\n::\n\n $ bump run\n Building\n Running\n $ bump build run\n Building\n Running\n $ bump build build run\n Building\n Building\n Running\n\n``str`` requirements will be interpreted as files / paths.\n\n--------------\n\nGenerated files can be specified with an optional ``gens`` keyword\nargument:\n\n::\n\n @b.task(gens='docs')\n def docs():\n print 'Documenting'\n\nGenerated files will be saved and can be automatically deleted with\nBumpy's ``clean()`` helper function. Generated files will also be used\nto look up file-based dependency chains.\n\n--------------\n\nTask aliases can be specified with an optional ``alias`` keyword\nargument:\n\n::\n\n @b.task(alias='pkg', reqs=(build, docs))\n def package():\n print 'Packaging'\n\n``alias`` can be a single alias or a tuple of aliases.\n\n--------------\n\nA task can be set as the 'default' task, ie the task that Bumpy will\ninvoke if no arguments are provided, by providing ``'default'`` as an\noptional argument:\n\n::\n\n @b.task('default'):\n def build():\n print 'Building'\n\n--------------\n\nA task can be set as the 'setup' task, ie the task that Bumpy will\ninvoke prior to any other tasks, by providing ``'setup'`` as an optional\nargument:\n\n::\n\n @b.task('setup')\n def setup():\n print 'Setting stuff up'\n\nSetup tasks can also accept arguments. More on this later!\n\n--------------\n\nSimilar to 'setup' tasks, 'teardown' tasks are invoked after every other\ntask, just before exiting:\n\n::\n\n @b.task('teardown')\n def teardown():\n print 'Tearing stuff down'\n\n--------------\n\nA task can be removed from the lookup table by adding a ``'private'``\noptional argument or by prefixing its name with an underscore:\n\n::\n\n @b.task('setup', 'private'):\n def setup():\n print 'Setting stuff up'\n\n @b.ask('teardown')\n def _teardown():\n print 'Tearing stuff down'\n\nPrivate tasks can still be required and executed, but cannot be invoked\nfrom the command line and will not be included in the built-in help.\n\n--------------\n\nA task can grab a reference to itself by adding a ``'method'`` optional\nargument:\n\n::\n\n @b.task('method', gens='output.txt')\n def output(self):\n print 'Generating {}'.format(self.gens)\n\n--------------\n\nFunction arguments / keyword arguments will be converted into\ncommand-line flags and options.\n\n::\n\n @b.task\n def docs(modules, format='markdown'):\n print 'Documenting {!r} as {}'.format(modules, format)\n\nWhich can then be invoked like this:\n\n::\n\n $ bump docs all\n Documenting 'all' as markdown\n $ bump docs --format rst bumpy\n Documenting 'bumpy' as rst\n $ bump docs\n abort [bumpy.main]: Too few arguments: [docs] expects 1\n $ bump docs --format rst\n abort [bumpy.main]: Too few arguments: [docs] expects 1\n\nKeyword arguments *must* come before standard arguments, contrary to\nPython's standards.\n\nHelpers\n^^^^^^^\n\nTo abort task execution and display an error message, use\n``abort(message, *formatargs)``:\n\n::\n\n @b.task\n def abort():\n b.abort('This task is bad.')\n\nIf ``*formatargs`` are provided, ``message`` will be used as a string\nformat for ``str.format``.\n\n--------------\n\nTo invoke shell commands, use ``shell(command, *formatargs)``:\n\n::\n\n @b.task\n def echo():\n '''This is an example task that uses a shell command.'''\n print b.shell('echo hi')\n\nIf ``*formatargs`` are provided, ``command`` will be used as a string\nformat for ``str.format``.\n\n--------------\n\nTo require tasks during execution rather than pre-execution, use\n``require(*reqs)``:\n\n::\n\n @b.task\n def test(fail=False):\n if fail:\n require(abort)\n\n print 'Flexibly surviving'\n\nTo check whether requirements are valid without actually executing them,\nuse ``valid(*reqs)``.\n\n--------------\n\nTo get the youngest age of a collection of files, use: ``age(*paths)``:\n\n::\n\n @b.task(reqs='input.txt', gens='output.txt')\n def output():\n if b.age('input.txt') < b.age('output.txt'):\n b.shell('cp input.txt output.txt')\n\n--------------\n\nIf you're meticulous about recording your generated files with ``gens``,\nBumpy will be able to automatically remove all generated files with\n``clean()``:\n\n::\n\n @b.task\n def clean():\n b.clean()\n\nNamespaces\n~~~~~~~~~~\n\nTasks can be grouped into namespaces by using an optional ``namespace``\nkeyword argument:\n\n::\n\n @b.task(namespace='db')\n def init():\n print 'Initialize database'\n\n::\n\n $ bump db.init\n Initialize database\n\nWhen bumpy fires up, it searches for modules in a ``bump/`` directory\nand imports them, assigning each an appropriate namespace. If you want\ntasks to be in the global namespace, add them to\n``bump/__bumpy_main__.py``, ``bum.py``, or ``build.py``, only the first\nof which will be imported. If tasks in one namespace depend on tasks in\nanother, you can use Python's ``import`` to import their containing\nmodule.\n\nCLI\n~~~\n\n``bump --version`` will print the currently running version of Bumpy.\n\n``bump -h`` or ``bump --help`` will print a built-in help message.\n\n``bump -f `` will tell ``bump`` to load a different file instead\nof ``bum.py`` or ``build.py``.\n\n``bump -v TASK`` will enable verbose mode, printing an enter/exit\nmessage each time a task begins and ends execution.\n\n``bump TASK1 TASK2 TASK3`` will execute tasks in sequence", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/scizzorz/bumpy", "keywords": null, "license": "MIT", "maintainer": null, "maintainer_email": null, "name": "bumpy", "package_url": "https://pypi.org/project/bumpy/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/bumpy/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/scizzorz/bumpy" }, "release_url": "https://pypi.org/project/bumpy/0.4.3/", "requires_dist": null, "requires_python": null, "summary": "Create build files and CLI tools easily.", "version": "0.4.3" }, "last_serial": 910445, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "03841288667f7456d83e452c3b8832ac", "sha256": "857678b08309b56aae4ad9c4d324567ad1b20c2135f995b152f576d903a60ee7" }, "downloads": -1, "filename": "bumpy-0.1.0.tar.gz", "has_sig": false, "md5_digest": "03841288667f7456d83e452c3b8832ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5476, "upload_time": "2013-08-27T19:13:34", "url": "https://files.pythonhosted.org/packages/b1/b7/7ec0c21acce5c84c48bf5af0b92aad6daf50a9e7b9ca8bec4cc04ed71f99/bumpy-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "201ec50e6f5e2197342275c660de5fbb", "sha256": "12d8ab4fa393f9d200c2d729670921af6f87564acaf04e80fcb8bf2573680ee0" }, "downloads": -1, "filename": "bumpy-0.1.1.tar.gz", "has_sig": false, "md5_digest": "201ec50e6f5e2197342275c660de5fbb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5429, "upload_time": "2013-08-27T19:15:49", "url": "https://files.pythonhosted.org/packages/b1/b3/063202dab5ba52e9bf94577566439bd66aef1aafc4f6f5ba8a8def46d4d2/bumpy-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "c8fb4d94f1a721c93302a97d11703023", "sha256": "adabc48b29ed47b6f504a623450b48782f3baa23af67d33d6baca39249e35b1b" }, "downloads": -1, "filename": "bumpy-0.1.2.tar.gz", "has_sig": false, "md5_digest": "c8fb4d94f1a721c93302a97d11703023", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5785, "upload_time": "2013-08-27T19:52:01", "url": "https://files.pythonhosted.org/packages/c9/80/9bd2acf47f94b723c17446b12e973abe2bc6cab22c12b10ad4c4d963bf57/bumpy-0.1.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "68df405f43cdad6f5af74426f346db72", "sha256": "fc5e52461f6635fa44e2ef85d17b46fe8ae018bbf0bcdc32b72be5d9c6362650" }, "downloads": -1, "filename": "bumpy-0.2.1.tar.gz", "has_sig": false, "md5_digest": "68df405f43cdad6f5af74426f346db72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6242, "upload_time": "2013-09-20T18:13:58", "url": "https://files.pythonhosted.org/packages/d6/ef/160522420f2a85f84a5600b09fd3316a606167a94133981a702a5fec83e5/bumpy-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "baceede2eb909470a8c444de28ca5c7d", "sha256": "91467d354938277a60e22f6403fb49e68596478081f5d48c61e28ebda5778f5c" }, "downloads": -1, "filename": "bumpy-0.2.2.tar.gz", "has_sig": false, "md5_digest": "baceede2eb909470a8c444de28ca5c7d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6222, "upload_time": "2013-09-20T21:07:52", "url": "https://files.pythonhosted.org/packages/bf/e2/2190581d970edcba3b6c8cfde761c02ff01e0fd2b5928f2467b0cd6307a8/bumpy-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "c4cf9c701f60c8ad20b98384e0bc9f74", "sha256": "bd2b160ef71ea32e6045542acf429116f2095d0ddcc122ab05c71d819b6b51cf" }, "downloads": -1, "filename": "bumpy-0.2.3.tar.gz", "has_sig": false, "md5_digest": "c4cf9c701f60c8ad20b98384e0bc9f74", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6227, "upload_time": "2013-09-22T19:28:47", "url": "https://files.pythonhosted.org/packages/23/8f/f3fb1899475eb3dab3ad4512be9c970a70d5b7315f9753aa9fa333f399ce/bumpy-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "f729fc3d4bfe8b46c58bd68b0f942ad9", "sha256": "0e0e9db102fd090d00d9fa63cc98cd22666322bd31e5436ef3e47eb6ecaad1d6" }, "downloads": -1, "filename": "bumpy-0.2.4.tar.gz", "has_sig": false, "md5_digest": "f729fc3d4bfe8b46c58bd68b0f942ad9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6325, "upload_time": "2013-09-22T19:45:53", "url": "https://files.pythonhosted.org/packages/5f/85/1846c7f185cb4161ccb07259bbcdc3fd9b6c06f49f423b44c89be7419dbd/bumpy-0.2.4.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "facb247275d7bb9cdfedf1856192a2fd", "sha256": "7bd9eac59ad53a6363c0df6a8085f20c66b4ce0488b1e6204f3ed8a04fb3d2bc" }, "downloads": -1, "filename": "bumpy-0.3.0.tar.gz", "has_sig": false, "md5_digest": "facb247275d7bb9cdfedf1856192a2fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9079, "upload_time": "2013-09-27T21:11:01", "url": "https://files.pythonhosted.org/packages/d0/6f/83341399c7e3badd1e85fb5a5d48cfc58958b31d72d487d5d2d1dddd8745/bumpy-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "28faca84bddd853622c048279a859491", "sha256": "9160f464b2989f7fddf0939641e09143763a87405433c5c1c39dea1f94bf5b08" }, "downloads": -1, "filename": "bumpy-0.4.0.tar.gz", "has_sig": false, "md5_digest": "28faca84bddd853622c048279a859491", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8798, "upload_time": "2013-10-06T20:16:00", "url": "https://files.pythonhosted.org/packages/23/2e/7615634f31af911444624acacb1a43b622265c82554126a703f640c33a2d/bumpy-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "e653b4a3e7561c16ab1271c018fc1329", "sha256": "723a940696e6d4ab7e4cb3f81689e7221204ea36aebff09c00d78e0d9e4a7580" }, "downloads": -1, "filename": "bumpy-0.4.1.tar.gz", "has_sig": false, "md5_digest": "e653b4a3e7561c16ab1271c018fc1329", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8835, "upload_time": "2013-10-06T22:05:52", "url": "https://files.pythonhosted.org/packages/91/d2/7d7cc19518f30bdd3c7b198178811a2386b111e2473cd92776084e77cf6a/bumpy-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "4c81ec8dd065d8f9929f87b1d0c31412", "sha256": "36e387dea826c8469d57832deafa0c8829a82d8c857b721eaddacd8c0eb5335b" }, "downloads": -1, "filename": "bumpy-0.4.2.tar.gz", "has_sig": false, "md5_digest": "4c81ec8dd065d8f9929f87b1d0c31412", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8890, "upload_time": "2013-10-06T23:54:27", "url": "https://files.pythonhosted.org/packages/ea/b3/cfb7e15400cdd990acdfbe336b17e6caf7a494e4f9de5f00f6680ecf7141/bumpy-0.4.2.tar.gz" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "dad1d5f72d326ca01e1b64f48ee911ac", "sha256": "1bff350934a0ca609612ffe5d7d54c22ca0ef520008bb4bd95768f377bc69a9c" }, "downloads": -1, "filename": "bumpy-0.4.3.tar.gz", "has_sig": false, "md5_digest": "dad1d5f72d326ca01e1b64f48ee911ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8937, "upload_time": "2013-11-04T01:26:57", "url": "https://files.pythonhosted.org/packages/fd/7a/fefd35a661587ef023b41b7bc79145bbbc3a0c6829cc8376096e618ed4dd/bumpy-0.4.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "dad1d5f72d326ca01e1b64f48ee911ac", "sha256": "1bff350934a0ca609612ffe5d7d54c22ca0ef520008bb4bd95768f377bc69a9c" }, "downloads": -1, "filename": "bumpy-0.4.3.tar.gz", "has_sig": false, "md5_digest": "dad1d5f72d326ca01e1b64f48ee911ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8937, "upload_time": "2013-11-04T01:26:57", "url": "https://files.pythonhosted.org/packages/fd/7a/fefd35a661587ef023b41b7bc79145bbbc3a0c6829cc8376096e618ed4dd/bumpy-0.4.3.tar.gz" } ] }