{ "info": { "author": "Mike Thomas", "author_email": "versionflow@whatang.org", "bugtrack_url": null, "classifiers": [], "description": "# versionflow 0.4.0\n\nAutomatic Semantic Versioning with Git Flow.\n\nThe point of versionflow is to enhance the [Git Flow](https://nvie.com/posts/a-successful-git-branching-model/) branching model with an automated approach to [semantic versioning](https://semver.org/) of your software's releases. It installs a command line utility which you can use to check your repo's status, initialise the versionflow approach, and create semantically versioned releases.\n\n## Installation\n\n`versionflow` is a Python package. With a Python installation, do\n\n pip install versionflow\n\nto install it.\n\n## Getting Started With versionflow\n\n`versionflow` works on two assumptions: that you will use the Git Flow methodology for development, and that you want to tag commits on the `master` branch of your project with semantic version numbers.\n\nTo get started with a project, you need to initialise it to use Git and Git Flow, and have a versionflow configuration file. You **could** do all that by hand, but luckily `versionflow` can do it for you. Just run\n\n versionflow init\n\nin youir project's root directory and `versionflow` will create a git repo, initialise it with Git Flow branches, create the config file, and tag the first (empty) commit as \"0.0.0\".\n\nNow we do some work and commit it to our development branch, and we're ready to create our first release! Let's first check that we're ready:\n\n versionflow check\n\nThis will run through a few checks to make sure we're ready to start a release:\n\n1. We're in a git repo, initialised for Git Flow.\n2. The repo is clean: there are no tracked files with uncommitted changes.\n3. We have a versionflow config file, and the version number in it is consistent with the last version tag.\n\nThese checks all get done before you can actually perform a versionflow release & bump action, but it's good to be able to see your current status without the possibility of affecting anything.\n\nNow, let's do our release! It's our first one, so we'll say it's a minor release, i.e. we're going to release v0.1.0.\n\n versionflow minor\n\nThat's it! versionflow will do the same checks as above, and if everything is OK it will perform a few actions:\n\n1. Create a \"Release/0.1.0\" branch from the current development commit.\n2. Update the version number in the versionflow configuration file from 0.0.0 to 0.1.0.\n3. Merging \"Release/0.1.0/ into master, and remove the release branch.\n4. Tag the merge commit on master as \"0.1.0\".\n5. Merge the master branch into develop, so that the latest tag and version number in there is 0.1.0.\n\nSo now you'll have a nice, consistent repo: the master branch will contain your latest release, tagged to the appropriate version number.\n\n### Using the version number in code\n\nIt's nice to have a version number in the tags of your repo which you can easily manage from the command line, but your code itself might want to make use of the same number. This is simple with versionflow - just write the current version number in any of your files, then `versionflow add` those files. From now on those files will be modified by `versionflow` whenever it updates the current version number. Any instances of the old version number in the specified files will be replaced by the new version number.\n\nFor example, suppose we add a `README.md` file to the above example. In that file we put\n\n # My awesome program v0.1.0\n\n It's 1337!\n\nWe don't want to have to manage that version number by hand. So we do\n\n versionflow add `README.md`\n\nWe do some more development and now we're ready to release v.0.2.0, so we run\n\n versionflow minor\n\nNow `versionflow` will bump the version in both its own configuration _and_ the `README.md` file, merge the develop branch into master, and tag the resulting commit with \"0.2.0\". `README.md` now looks like this:\n\n # My awesome program v0.2.0\n\n It's 1337!\n\nWe never have to worry about manually updating the version number in the README ever again. You can add as many files as you want to `versionflow` and it will update the version number in all of them.\n\n## Commands\n\n- **check**\n Check whether this directory is correctly initialised for versionflow, and ready to bump a version number: is it a git repo; is the repo clean (i.e. not dirty); does it have the standard Git Flow branches; does it have a versionflow config file; does it have a semantic version tag on the `master` branch matching the versionflow config?\n- **init**\n Initialise this directory as a versionflow project: create a git repo (if there isn't already one); set up the Git Flow branches (if they don't already exist); and create a versionflow config file (if it does not exist).\n- **major**\n Create a release of this project from the latest commit on `development` with the major version number bumped.\n- **minor**\n Create a release of this project from the latest commit on `development` with the minor version number bumped.\n- **patch**\n Create a release of this project from the latest commit on `development` with the patch version number bumped.\n- **describe**\n Show just the current version number in the repo, including a description of the current/parent commit if it is untagged.\n- **add**\n Add a file to `versionflow`.\n\n### Common Options\n\nAll the commands described above take the following options:\n\n- --repo-dir PATH\n Use the given PATH as the root of the versionflow repo. Defaults to the current directory.\n- --config FILE\n Use the given FILE as the versionflow configuration file. Defaults to `.versionflow`.\n- --version\n Print the current version of versionflow, and exit.\n- --help\n Print a help message\n\n## Development\n\nTo create an environment in which to develop `versionflow`, clone the git repository and create a Python virtual environment using virtualenv. Then in the cloned repo, using the virtual environment, do\n\n pip -r requirements-dev.txt\n\nThis will install all the Python modules needed for developing versionflow.\n\n### Testing\n\nIt is a good idea to create different testing virtual envs for versionflow as well as your dev environment. This will ensure that the package is configured to install properly via the configuration in `setup.cfg`, and that you don't have a hidden dependency on something installed in your dev environment.\n\nTo install your development version of versionflow in a testing virtual env, activate it, then do\n\n pip install -e .\n\nin your local copy of the versionflow repo. Now as you work on it your latest changes will always be available in the virtual environment.\n\n## Acknowledgements\n\n`versionflow` uses:\n\n- [setuptools_scm](https://pypi.org/project/setuptools-scm/) to find version numbers from commit tags;\n- [nu-gitflow](https://github.com/chassing/gitflow/) to perform Git Flow actions;\n- [bump2version](https://pypi.org/project/bump2version/) to increment version numbers in files;\n- and [gitpython](https://github.com/gitpython-developers/GitPython) to perform miscellaneous git actions.\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/Whatang/versionflow", "keywords": "versioning", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "versionflow", "package_url": "https://pypi.org/project/versionflow/", "platform": "", "project_url": "https://pypi.org/project/versionflow/", "project_urls": { "Homepage": "https://github.com/Whatang/versionflow" }, "release_url": "https://pypi.org/project/versionflow/0.4.0/", "requires_dist": [ "click (==7.0)", "setuptools-scm (==3.2.0)", "attrs (==18.2.0)", "bump2version (==0.5.10)", "gitpython (==2.1.11)", "nu-gitflow (==1.0.2)", "configparser", "six (==1.12.0)" ], "requires_python": "", "summary": "Automatic Semantic Versioning with Git Flow.", "version": "0.4.0", "yanked": false, "yanked_reason": null }, "last_serial": 6068553, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "d544c312bc28accece0fad44ee0feec0", "sha256": "9bae4b55352e06763bcc977fd13725b0bf16ae0af14970d47f7ccbd3234b2c95" }, "downloads": -1, "filename": "versionflow-0.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d544c312bc28accece0fad44ee0feec0", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7465, "upload_time": "2019-10-26T15:54:16", "upload_time_iso_8601": "2019-10-26T15:54:16.945772Z", "url": "https://files.pythonhosted.org/packages/78/f7/4d7e69acfd577971fa276f517f2d38ea1d8db0a0d726fde49cf742c0b034/versionflow-0.1.1-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ca33e58972644d8c74cb1fadb34269c7", "sha256": "8c694cce18d1dffaa7b34d33653669cccb70f0e4586b35031b49efc9305d024c" }, "downloads": -1, "filename": "versionflow-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ca33e58972644d8c74cb1fadb34269c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13433, "upload_time": "2019-10-26T15:54:19", "upload_time_iso_8601": "2019-10-26T15:54:19.372941Z", "url": "https://files.pythonhosted.org/packages/57/7a/0f37593571d3bd94d1d2bdcc1f0eab3f2d0206c6a27b781f49480bee2011/versionflow-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "7b9b5c121e625901e6dcb43b3ab1e85c", "sha256": "346e27631d11edadc17056d416f58da5583437e1807b55a3597f3055837aa075" }, "downloads": -1, "filename": "versionflow-0.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "7b9b5c121e625901e6dcb43b3ab1e85c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7412, "upload_time": "2019-10-26T16:51:54", "upload_time_iso_8601": "2019-10-26T16:51:54.571013Z", "url": "https://files.pythonhosted.org/packages/36/4b/6476ef7709c040606771e9dbf0ea26e879fd9cc539435010baf90f46f9fa/versionflow-0.2.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "cde8a9005c87fbfe384bbcf8cf8c745f", "sha256": "552e7148224be0b8a82afcce127ecca26d38cfddaa5349cad6ecedfded21bb55" }, "downloads": -1, "filename": "versionflow-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "cde8a9005c87fbfe384bbcf8cf8c745f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7411, "upload_time": "2019-10-26T16:52:20", "upload_time_iso_8601": "2019-10-26T16:52:20.886972Z", "url": "https://files.pythonhosted.org/packages/96/c5/b7522b048bc69da55ccabc35a41f2cc163dc283e9a413da5938807157728/versionflow-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b45a8afda72f5c4fd865566c1f918e76", "sha256": "b75584f1c890a160bd1f9b48526c6dcee88295663e8b4c874c81347a8acfb9a2" }, "downloads": -1, "filename": "versionflow-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b45a8afda72f5c4fd865566c1f918e76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15723, "upload_time": "2019-10-26T16:51:55", "upload_time_iso_8601": "2019-10-26T16:51:55.981674Z", "url": "https://files.pythonhosted.org/packages/2b/d4/824411e87f82d061817126b7227e22ce9038a6d9d5422d1184e562be3f4f/versionflow-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "df0bd5a0071b96211aafa2c65c6522e5", "sha256": "43cc0877dd3a8f2192afe8f12eade32c77c0866f70935ef628d442fbcff67d40" }, "downloads": -1, "filename": "versionflow-0.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "df0bd5a0071b96211aafa2c65c6522e5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7833, "upload_time": "2019-10-28T15:44:22", "upload_time_iso_8601": "2019-10-28T15:44:22.545249Z", "url": "https://files.pythonhosted.org/packages/4d/3d/f6d85912a1e7d6c3df978ecdb649b881300e2b8907acd65d69a3ba627b03/versionflow-0.3.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "98323e2a03fdd686992b54461425eddd", "sha256": "fe3d2867667d981d171d913cbcd9f4293393603958f3ca74aa548d9e82a62f8d" }, "downloads": -1, "filename": "versionflow-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "98323e2a03fdd686992b54461425eddd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7832, "upload_time": "2019-10-28T15:43:37", "upload_time_iso_8601": "2019-10-28T15:43:37.718780Z", "url": "https://files.pythonhosted.org/packages/a5/48/01bc0cea25f6e4cf6d7cf984d54df5fe8d6390f425caa5e304fd6228160e/versionflow-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a5a50ac0b9f395ffa3bdeed40754d7f9", "sha256": "a073ebb90baec94713ba2e4dd9cbc126b613573a27c1cb76eaa3feb69f06a769" }, "downloads": -1, "filename": "versionflow-0.3.0.tar.gz", "has_sig": false, "md5_digest": "a5a50ac0b9f395ffa3bdeed40754d7f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16043, "upload_time": "2019-10-28T15:43:39", "upload_time_iso_8601": "2019-10-28T15:43:39.034280Z", "url": "https://files.pythonhosted.org/packages/f5/af/2e3050c0cf3a44005e0f7a0696b44245147a81c70e67272050535ffbde06/versionflow-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.5": [ { "comment_text": "", "digests": { "md5": "c368a30888f4ec4703dcb390d21fbbdf", "sha256": "2ad15d6795174b3929700ff64886e708788a00b4d272f93b736f95bed9aa5fc7" }, "downloads": -1, "filename": "versionflow-0.3.5-py2-none-any.whl", "has_sig": false, "md5_digest": "c368a30888f4ec4703dcb390d21fbbdf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7811, "upload_time": "2019-10-28T16:51:22", "upload_time_iso_8601": "2019-10-28T16:51:22.450785Z", "url": "https://files.pythonhosted.org/packages/27/9a/f1bb109db32996e2c6d276b91422cdb74ab78765e16fbb0738b225d3600b/versionflow-0.3.5-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "85917b0873ccc4bc8e3ddf9d130b2c13", "sha256": "c6f31cf2b4d908a5b3a0197eac98e7c8c883214dbfec6fdc11231aa8c6fee20a" }, "downloads": -1, "filename": "versionflow-0.3.5-py3-none-any.whl", "has_sig": false, "md5_digest": "85917b0873ccc4bc8e3ddf9d130b2c13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7811, "upload_time": "2019-10-28T16:51:00", "upload_time_iso_8601": "2019-10-28T16:51:00.359214Z", "url": "https://files.pythonhosted.org/packages/d6/e0/030633ce6b21591d43bf95a2d671a3c447f0aba99f37919aa5ed3b40264a/versionflow-0.3.5-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ee124faead91ab1b8e7c44803de59480", "sha256": "fb5834fecba4f64d795e9793cba0c3a4dac9c5e73a043df5acc05a9cd3947bd9" }, "downloads": -1, "filename": "versionflow-0.3.5.tar.gz", "has_sig": false, "md5_digest": "ee124faead91ab1b8e7c44803de59480", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16001, "upload_time": "2019-10-28T16:51:01", "upload_time_iso_8601": "2019-10-28T16:51:01.666190Z", "url": "https://files.pythonhosted.org/packages/4e/45/67f936fd8632c5211f47a8b56bb66456a3923fe7affed26845062bc75538/versionflow-0.3.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.6": [ { "comment_text": "", "digests": { "md5": "b67eec4e81ff03a4fcce0e80dd81ff3a", "sha256": "b4284b863d2f4d11d6d77db8e7ca12bfda027d4515e5e5ec858732438248414a" }, "downloads": -1, "filename": "versionflow-0.3.6-py2-none-any.whl", "has_sig": false, "md5_digest": "b67eec4e81ff03a4fcce0e80dd81ff3a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 7882, "upload_time": "2019-10-28T17:33:28", "upload_time_iso_8601": "2019-10-28T17:33:28.847391Z", "url": "https://files.pythonhosted.org/packages/d2/04/1ba47c1d288134066ba224f27cf78a73f921ae03aeafbc26d4b2b75d16d3/versionflow-0.3.6-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0044c4f83109ee6e61cdec147a92deb8", "sha256": "418074669550ba2374240b3aea8edcca798ce6e57c44a23b6fb6e09f63754a02" }, "downloads": -1, "filename": "versionflow-0.3.6-py3-none-any.whl", "has_sig": false, "md5_digest": "0044c4f83109ee6e61cdec147a92deb8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7880, "upload_time": "2019-10-28T17:32:52", "upload_time_iso_8601": "2019-10-28T17:32:52.589791Z", "url": "https://files.pythonhosted.org/packages/71/83/897682cfa5be8cc17d904e13472fc5716d67020e2f413b985783f35e300b/versionflow-0.3.6-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a96b0f14b3eddc386411802ad6da05d9", "sha256": "ca1c8d2f917751fd73f64da68d2afc80d6fad9eaa85e60af88dfcc5272947ee4" }, "downloads": -1, "filename": "versionflow-0.3.6.tar.gz", "has_sig": false, "md5_digest": "a96b0f14b3eddc386411802ad6da05d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16061, "upload_time": "2019-10-28T17:32:53", "upload_time_iso_8601": "2019-10-28T17:32:53.614218Z", "url": "https://files.pythonhosted.org/packages/c5/6a/cc2944135a5f8fb9b280acff8def6f45762cc974c7b482f149c5c6e2fe9f/versionflow-0.3.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "1d5495ffb107f3bad8f8775a7795c64a", "sha256": "c59822c5097e9058acd5ddcfe74d4472446c04a9fca47a2b465dee62ca2aa778" }, "downloads": -1, "filename": "versionflow-0.4.0-py2-none-any.whl", "has_sig": false, "md5_digest": "1d5495ffb107f3bad8f8775a7795c64a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8677, "upload_time": "2019-11-02T17:03:46", "upload_time_iso_8601": "2019-11-02T17:03:46.034595Z", "url": "https://files.pythonhosted.org/packages/b3/2b/15a88b803c8350c74cce0afafe5fed112fd6354f489c6ff74dfdd31973d0/versionflow-0.4.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c6b6a4ef6ec4d39e3876eda6bbedd756", "sha256": "a378c5d1ef8aedd965d2e43b21ca2c02918ddfbeab69d3025cc56837e0d24850" }, "downloads": -1, "filename": "versionflow-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c6b6a4ef6ec4d39e3876eda6bbedd756", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8676, "upload_time": "2019-11-02T17:03:14", "upload_time_iso_8601": "2019-11-02T17:03:14.823451Z", "url": "https://files.pythonhosted.org/packages/2f/c6/514da9ec5490f27f87045a163287a10cff984549ea5bfed73c7bab0e0e37/versionflow-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fea3af618cc9ca95c3aa23da458aa9f2", "sha256": "ebb72ee3ee6f90585c602568e92da51b5dfba85bde688106a69e0e3892f53a55" }, "downloads": -1, "filename": "versionflow-0.4.0.tar.gz", "has_sig": false, "md5_digest": "fea3af618cc9ca95c3aa23da458aa9f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17534, "upload_time": "2019-11-02T17:03:16", "upload_time_iso_8601": "2019-11-02T17:03:16.017601Z", "url": "https://files.pythonhosted.org/packages/59/03/40fc1c467f694466f14bf0bd6faddffe103b08e2f0bf48e90226242b7ada/versionflow-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1d5495ffb107f3bad8f8775a7795c64a", "sha256": "c59822c5097e9058acd5ddcfe74d4472446c04a9fca47a2b465dee62ca2aa778" }, "downloads": -1, "filename": "versionflow-0.4.0-py2-none-any.whl", "has_sig": false, "md5_digest": "1d5495ffb107f3bad8f8775a7795c64a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 8677, "upload_time": "2019-11-02T17:03:46", "upload_time_iso_8601": "2019-11-02T17:03:46.034595Z", "url": "https://files.pythonhosted.org/packages/b3/2b/15a88b803c8350c74cce0afafe5fed112fd6354f489c6ff74dfdd31973d0/versionflow-0.4.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c6b6a4ef6ec4d39e3876eda6bbedd756", "sha256": "a378c5d1ef8aedd965d2e43b21ca2c02918ddfbeab69d3025cc56837e0d24850" }, "downloads": -1, "filename": "versionflow-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c6b6a4ef6ec4d39e3876eda6bbedd756", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8676, "upload_time": "2019-11-02T17:03:14", "upload_time_iso_8601": "2019-11-02T17:03:14.823451Z", "url": "https://files.pythonhosted.org/packages/2f/c6/514da9ec5490f27f87045a163287a10cff984549ea5bfed73c7bab0e0e37/versionflow-0.4.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "fea3af618cc9ca95c3aa23da458aa9f2", "sha256": "ebb72ee3ee6f90585c602568e92da51b5dfba85bde688106a69e0e3892f53a55" }, "downloads": -1, "filename": "versionflow-0.4.0.tar.gz", "has_sig": false, "md5_digest": "fea3af618cc9ca95c3aa23da458aa9f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17534, "upload_time": "2019-11-02T17:03:16", "upload_time_iso_8601": "2019-11-02T17:03:16.017601Z", "url": "https://files.pythonhosted.org/packages/59/03/40fc1c467f694466f14bf0bd6faddffe103b08e2f0bf48e90226242b7ada/versionflow-0.4.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }