~bzr/ubuntu/lucid/bzr/beta-ppa

« back to all changes in this revision

Viewing changes to doc/developers/api-versioning.txt

  • Committer: Martin Pool
  • Date: 2010-07-02 07:29:40 UTC
  • mfrom: (129.1.7 packaging-karmic)
  • Revision ID: mbp@sourcefrog.net-20100702072940-hpzq5elg8wjve8rh
* PPA rebuild.
* PPA rebuild for Karmic.
* PPA rebuild for Jaunty.
* PPA rebuild for Hardy.
* From postinst, actually remove the example bash completion scripts.
  (LP: #249452)
* New upstream release.
* New upstream release.
* New upstream release.
* Revert change to Build-depends: Dapper does not have python-central.
  Should be python-support..
* Target ppa..
* Target ppa..
* Target ppa..
* Target ppa..
* New upstream release.
* Switch to dpkg-source 3.0 (quilt) format.
* Bump standards version to 3.8.4.
* Remove embedded copy of python-configobj. Closes: #555336
* Remove embedded copy of python-elementtree. Closes: #555343
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* debian/control: Fix obsolete-relation-form-in-source
  lintian warning. 
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split out docs into bzr-doc package.
* New upstream release.
* Added John Francesco Ferlito to Uploaders.
* Fix install path to quick-reference guide
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again, again.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to path changes.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Bump standards version to 3.8.3.
* Remove unused patch system.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix copy and paste tab error in .install file
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
 + Fixes compatibility with Python 2.4. Closes: #537708
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream version.
* Bump standards version to 3.8.2.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add python-pyrex to build-deps to ensure C extensions are always build.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix API compatibility version. (Closes: #526233)
* New upstream release.
  + Fixes default format for upgrade command. (Closes: #464688)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add missing dependency on zlib development library. (Closes:
  #523595)
* Add zlib build-depends.
* Add zlib build-depends.
* Add zlib build-depends.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Move to section vcs.
* Bump standards version to 3.8.1.
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Recommend ca-certificates. (Closes: #452024)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Update watch file. bazaar now uses launchpad to host its sources.
* Remove patch for inventory root revision copy, applied upstream.
* New upstream release.
* New upstream release.
* New upstream release
* Force removal of files installed in error to /etc/bash_completion.d/
  (LP: #249452)
* New upstream release.
* New upstream release
* New upstream release.
* Bump standards version.
* Include patch for inventory root revision copy, required for bzr-svn.
* New upstream release.
* Remove unused lintian overrides.
* Correct the package version not to be native.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Final 1.5 release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add myself as a co-maintainer.
* Add a Dm-Upload-Allowed: yes header.
* New upstream bugfix release.
* New upstream release.
* Final 1.3 release.
* New upstream release.
* First release candidate of the upcoming 1.3 release.
* Rebuild to fix the problem caused by a build with a broken python-central.
* New upstream release.
* Rebuild for dapper PPA.
* Apply Lamont's patches to fix build-dependencies on dapper.
  (See: https://bugs.launchpad.net/bzr/+bug/189915)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
==============
 
2
API Versioning
 
3
==============
 
4
 
 
5
Status
 
6
======
 
7
 
 
8
:Date: 2007-06-26
 
9
 
 
10
bzrlib has a rich API which is used both internally, and externally by
 
11
plugins_ and scripts. To allow the API to change, specifically to allow
 
12
support for features and methods to be removed, without causing hard to
 
13
diagnose bugs in the clients of the API, bzrlib provides explicit API
 
14
compatibility data, and a compact API to allow scripts and plugins to
 
15
ascertain if the bzrlib they are using is compatible to the API they were
 
16
written against.
 
17
 
 
18
 
 
19
.. _plugins: plugin-api.html
 
20
 
 
21
 
 
22
.. contents::
 
23
 
 
24
 
 
25
Motivation
 
26
==========
 
27
 
 
28
To allow plugins to apply their own policy for compatibility with bzrlib,
 
29
without requiring a new release on every library release. Plugins should
 
30
also be able to use the API to export their own compatibility information
 
31
for code reuse between plugins.
 
32
 
 
33
 
 
34
Terminology
 
35
===========
 
36
 
 
37
An **API** is a collection of python objects/modules/packages which can be
 
38
used by plugins and scripts. The ``bzrlib`` **API** covers all of bzrlib,
 
39
but we can be more precise - e.g. the ``WorkingTree API``.
 
40
An **API version** is a tuple ``(major, minor, point)``.
 
41
 
 
42
 
 
43
API versions
 
44
============
 
45
 
 
46
For simplicity we treat API's as being compatible with a range of
 
47
versions: the current release of the API, and some oldest version which is
 
48
also compatible. While we could say that there is a set of older versions
 
49
with which the current version is compatible, a range is easier to
 
50
express, and easier for a human to look at and understand, and finally
 
51
easier to manage. The oldest version with which the API for a python
 
52
object is compatible is obtained by looking up the ``api_minimum_version``
 
53
attribute on the python object handed to ``require_api``, and failing that
 
54
the bzrlib ``api_minimum_version`` is returned. The current version of the
 
55
API is obtained by looking for an ``api_current_version`` attribute, and
 
56
if that is not found, an ``version_info`` attribute (of which the first 3
 
57
elements are used). If no current version can be found, the bzrlib
 
58
``version_info`` attribute is used to generate a current API version.
 
59
This lookup sequence allows users with simple setups (and no python style
 
60
``version_info`` tuple) to still export an API version, and for new API's
 
61
to be managed more granularly later on with a smooth transition -
 
62
everything starts off in lockstep with bzrlib's master version.
 
63
 
 
64
API versions are compared lexically to answer the question 'is
 
65
the requested version X <= the current version, and >= the minimum
 
66
version'.
 
67
 
 
68
Managing API versions
 
69
=====================
 
70
 
 
71
The minimum API versions should be adjusted to the **oldest** API version
 
72
with which client code of the API will successfully run. It should not be
 
73
changed simply because of adding things in a compatible manner, or
 
74
deprecating features, but rather when errors will occur if client code is
 
75
not updated.  Versions for API's from ``bzrlib`` are given the version
 
76
numbers that ``bzrlib`` has had for consistency. Plugins should also take
 
77
this approach and use the version numbering scheme the plugin used.
 
78
 
 
79
Exported API's
 
80
==============
 
81
 
 
82
Currently we export a single API - the ``bzrlib API`` - and no finer
 
83
grained APIs. The API versioning support was introduced in bzrlib 0.18.
 
84
For plugins or tools that want to dynamically check for the presence of
 
85
the API versioning API, you should compare ``bzrlib.version_info[0:3]``
 
86
with ``(0, 18, 0)``.
 
87
 
 
88
+------------+---------------+
 
89
| API        | Covers        |
 
90
+============+===============+
 
91
| bzrlib     | All of bzrlib |
 
92
+------------+---------------+
 
93
 
 
94
Use Cases
 
95
=========
 
96
 
 
97
Some examples of using the API.
 
98
 
 
99
Requiring bzrlib 0.18 in a plugin
 
100
---------------------------------
 
101
 
 
102
In the plugins __init__.py::
 
103
 
 
104
  import bzrlib
 
105
  from bzrlib.api import require_api
 
106
  from bzrlib.errors import IncompatibleAPI
 
107
  try:
 
108
    require_api(bzrlib, (0, 18, 0))
 
109
  except IncompatibleAPI:
 
110
    raise ImportError("A bzrlib compatible with 0.18 is required.")
 
111
 
 
112
Exporting an API from a plugin
 
113
------------------------------
 
114
 
 
115
In the plugin ``foo`` exporting the API (in __init__.py)::
 
116
 
 
117
  version_info = (0, 0, 1, 'beta', 1)
 
118
  api_version = (0, 0, 1)
 
119
 
 
120
In a plugin depending on that plugin (in __init__.py)::
 
121
 
 
122
  import bzrlib.plugins.foo
 
123
  from bzrlib.api import require_api
 
124
  from bzrlib.errors import IncompatibleAPI
 
125
  try:
 
126
    require_api(bzrlib.plugins.foo, (0, 0, 1))
 
127
  except IncompatibleAPI:
 
128
    raise ImportError("A bzrlib compatible with 0.0.1 is required.")
 
129
 
 
130
 
 
131
..
 
132
   vim: ft=rst tw=74 ai
 
133