On API stability and versioning

The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this section are to be interpreted as described in RFC 2119.

Requiring PEP 492

Using a Python interpreter which implements PEP 492 will not be required at least until 0.7. Independent of that, version 1.0.0 will require PEP 492. There may be features which are not or only inconveniently usable without PEP 492 before PEP 492 support becomes mandatory for aioxmpp (one example is Client.connected()).

Semantic versioning and version numbers

aioxmpp complies with Semantic Versioning 2.0.0. The key points related to API stability are summarized below for your convenience.

The version of the aioxmpp package can be obtained by inspecting aioxmpp.__version__, which contains the version as a string. Unreleased versions have the -devel (up to and including version 0.4) or -a0 (since 0.5) suffix. An additional way to access the version number is aioxmpp.version_info, which provides a tuple which can be compared against other version tuples to check for a specific range of aioxmpp versions.

Versions with -a0 suffix are never released; if there will ever be pre-releases, they start at -a1.

Up to version 1.0.0

Up to version 1.0.0, the API inside the aioxmpp package MAY change without notice in advance. These changes MAY break code in ways which makes it impossible to have code which works with both the old and the new version.

Changes to the public, non-plugin API SHOULD NOT break code in a way which makes it impossible to use with old and new versions.

The Changelog may not be complete, but SHOULD contain all changes which break existing code.

The below text, which describes the behaviour for versions from 1.0 onwards, MAY change without notice in advance.

From version 1.0.0 onwards

Branching

Two active development branches are used, one for the next minor and one for the next major release. The branch for the next minor release is called devel-X.Y, where X and Y are the major and minor version number of the upcoming release, respectively. The branch for the next major release is called devel.

When a minor release is due, two new branches are created (devel-X.Yn, where Yn = Y+1) and release-X.Y.0. In the devel-X.Yn branch, a new commit is made to update the version number to (X, Yn, 0, 'a0'). In the release-X.Y.0 branch, the final preparations for the release (such as updating the readme) are done. devel-X.Y is kept around to prepare patch releases and it receives a commit which increments the patch version number by one without removing the pre-release marker. When the release has been fully prepared in release-X.Y.0, the commit is tagged appropriately and packages for all targets are prepared.

When a major release is due, a new branch is created (devel-Xn.0, where Xn = X+1). The remaining procedure is identical to preparing a minor release for X.0, including the creation of the two (additional) branches.

When a patch release is needed, the patch must be prepared in a feature branch, branched off the oldest release to which the patch is supposed to be applied. The feature branch can then be merged in all the devel-X.Y branches where the patch is needed. Each of these branches is then merged in the corresponding release-X.Y branch with a non-fast-forward merge. The version number in the release branches is bumped and the usual release procedure takes place.

In general, the tree of a commit in a devel branch MUST always have a prerelease marker. The trees in the heads of the release-X.Y branches may not have prerelease markers, if they are also tagged as releases.

An appealing property of this scheme is that merging from lower versions to upper versions is possible (or the other way round, but not in both directions; the other way round makes not as much sense though). At the first merge from a lower to a higher version, a merge conflict with respect to the version number will appear. Future merges will not have this conflict again, which is also why merging downwards is not allowed (it would override the lower version number with the higher version number).

The release with the highest version number is always merged into master. The version number in master MUST increase monotonically; patch releases are thus not merged into master, unless they are made against the most recent release in master.

Versioning and stability

Still to be done.