setup.py: versions
Date: January 23rd 2016
Last updated: January 24th 2016
Todays entry looks at setting versions with setuptools.
The most important part about this is to ensure that setuptools and easy_install can tell which package is most recent. A version number is a series of numbers and letters that are treated numerically (e.g. 1.0, 2.0.1... 3.3.3).
Convention: major.minor[.patch][sub]
# milestones
major = major milestones
minor = features added
patch = bug fixing
sub = incremental releases
sub alpha [functionality changes = a1, a2, a3... aN]
sub beta [bug fixes = b1, b2, b3... bN]
sub final pre-release [testing = pr1, pr2, pr3... prN]
Quick start
Initial release = 0.1.0
Added features = 0.2.0
Bug fix patch = 0.2.1
first alpha release = 0.2.1a1
second alpha release = 0.2.1a2
sub release bug fix = 0.2.1b1
final test version of patch = 0.2.1pre1
Several commited bug fixes = 0.2.2
Final set of features added = 1.0.0
Tip:
Add CHANGES.txt file to the root directory of your distribution.
# version, date, notes
v0.1.0, 20150123, Initial release
v0.1.1, 20150123, Minor updates
Some things to note:
Pre-release
- 01.2 is the same as 1.2 (leading zero ignored)
- 1.2 is the same release number as 1.2.0
- 1.10 is the tenth sub-release of version 1 and not the same as 1.1
- a pre-release tag looks like 1.2c1 (candidate 1)
- 1.2c1 (release candidate 1) is older than 1.2
But, 1.2c1 is newer than 1.2b1 and 1.2a1
a pre-release tag is just a series of letters that alphabetically come before the "final"
- alpha => 1.2 alpha1 (spaces after numbers ok)
- beta => 1.2beta1
- dev => 1.2-dev1
There are three special pre-release tags
- pre
- preview
- rc
- 1.2pre1 == 1.2preview1 == 1.2rc1 == 1.2c1
post-release
- a post-release tag is a series of letters alphabetically equal to or higher than "final or a dash"
- a post-release tag looks like 1.2pl or 1.2-l
- a post-release tag (1.2pl) is older than the next sub-release (1.3)
- a post-release tag is usually appended with a patch number or a datestamp (e.g. 1.2-r1234 or 1.2-20160123)
long release names
- 1.2a4.dev-r1234
- fourth alpha release of 1.2
- This is a pre-release (due to the dev tag)
- This version is considered older than 1.2 and 1.2a4
- and is an in development version of the fourth alpha release
- revision number 1234
verify release names
from pkg_resources import parse_version
parse_version('1.2a4.dev-r1234') < parse_version('1.2.0')
parse_version('1.2a4.dev-r1234') < parse_version('1.2.1')