~bzr-pqm/bzr/bzr.dev

5752.3.8 by John Arbash Meinel
Merge bzr.dev 5764 to resolve release-notes (aka NEWS) conflicts
1
# Copyright (C) 2007, 2008, 2009, 2011 Canonical Ltd
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
16
2550.2.3 by Robert Collins
Add require_api API.
17
"""Library API versioning support.
18
19
Added in bzrlib 0.18 this allows export of compatibility information about
20
bzrlib. Please see doc/developers/api-versioning.txt for design details and
21
examples.
22
"""
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
23
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
24
from __future__ import absolute_import
25
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
26
import bzrlib
27
from bzrlib.errors import IncompatibleAPI
28
29
30
def get_current_api_version(object_with_api):
31
    """Return the API version tuple for object_with_api.
32
33
    :param object_with_api: An object to look for an API version on. If the
34
        object has a api_current_version attribute, that is used. Otherwise if
35
        there is a version_info attribute, its first three elements are used.
36
        Finally if there was no version_info attribute, the current api version
37
        of bzrlib itself is used.
2550.2.3 by Robert Collins
Add require_api API.
38
39
    Added in bzrlib 0.18.
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
40
    """
41
    try:
42
        return object_with_api.api_current_version
43
    except AttributeError:
44
        try:
45
            return object_with_api.version_info[0:3]
46
        except AttributeError:
47
            return get_current_api_version(bzrlib)
48
49
50
def get_minimum_api_version(object_with_api):
51
    """Return the minimum API version supported by object_with_api.
52
53
    :param object_with_api: An object to look for an API version on. If the
54
        object has a api_minimum_version attribute, that is used. Otherwise the
55
        minimum api version of bzrlib itself is used.
2550.2.3 by Robert Collins
Add require_api API.
56
57
    Added in bzrlib 0.18.
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
58
    """
59
    try:
60
        return object_with_api.api_minimum_version
61
    except AttributeError:
62
        return get_minimum_api_version(bzrlib)
2550.2.3 by Robert Collins
Add require_api API.
63
64
65
def require_api(object_with_api, wanted_api):
66
    """Check if object_with_api supports the api version wanted_api.
67
68
    :param object_with_api: An object which exports an API minimum and current
69
        version. See get_minimum_api_version and get_current_api_version for
70
        details.
71
    :param wanted_api: The API version for which support is required.
3766.3.3 by Robert Collins
Review tweaks.
72
    :return: None
2550.2.3 by Robert Collins
Add require_api API.
73
    :raises IncompatibleAPI: When the wanted_api is not supported by
74
        object_with_api.
75
76
    Added in bzrlib 0.18.
77
    """
78
    current = get_current_api_version(object_with_api)
79
    minimum = get_minimum_api_version(object_with_api)
80
    if wanted_api < minimum or wanted_api > current:
81
        raise IncompatibleAPI(object_with_api, wanted_api, minimum, current)
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
82
3766.3.3 by Robert Collins
Review tweaks.
83
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
84
def require_any_api(object_with_api, wanted_api_list):
85
    """Check if object_with_api supports the api version wanted_api.
86
87
    :param object_with_api: An object which exports an API minimum and current
88
        version. See get_minimum_api_version and get_current_api_version for
89
        details.
90
    :param wanted_api: A list of API versions, any of which being available is
91
        sufficent.
3766.3.3 by Robert Collins
Review tweaks.
92
    :return: None
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
93
    :raises IncompatibleAPI: When the wanted_api is not supported by
94
        object_with_api.
95
96
    Added in bzrlib 1.9.
97
    """
98
    for api in wanted_api_list[:-1]:
99
        try:
100
            return require_api(object_with_api, api)
101
        except IncompatibleAPI:
102
            pass
103
    require_api(object_with_api, wanted_api_list[-1])