~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
24
import bzrlib
25
from bzrlib.errors import IncompatibleAPI
26
27
28
def get_current_api_version(object_with_api):
29
    """Return the API version tuple for object_with_api.
30
31
    :param object_with_api: An object to look for an API version on. If the
32
        object has a api_current_version attribute, that is used. Otherwise if
33
        there is a version_info attribute, its first three elements are used.
34
        Finally if there was no version_info attribute, the current api version
35
        of bzrlib itself is used.
2550.2.3 by Robert Collins
Add require_api API.
36
37
    Added in bzrlib 0.18.
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
38
    """
39
    try:
40
        return object_with_api.api_current_version
41
    except AttributeError:
42
        try:
43
            return object_with_api.version_info[0:3]
44
        except AttributeError:
45
            return get_current_api_version(bzrlib)
46
47
48
def get_minimum_api_version(object_with_api):
49
    """Return the minimum API version supported by object_with_api.
50
51
    :param object_with_api: An object to look for an API version on. If the
52
        object has a api_minimum_version attribute, that is used. Otherwise the
53
        minimum api version of bzrlib itself is used.
2550.2.3 by Robert Collins
Add require_api API.
54
55
    Added in bzrlib 0.18.
2550.2.2 by Robert Collins
Add helpers to get api versions from objects.
56
    """
57
    try:
58
        return object_with_api.api_minimum_version
59
    except AttributeError:
60
        return get_minimum_api_version(bzrlib)
2550.2.3 by Robert Collins
Add require_api API.
61
62
63
def require_api(object_with_api, wanted_api):
64
    """Check if object_with_api supports the api version wanted_api.
65
66
    :param object_with_api: An object which exports an API minimum and current
67
        version. See get_minimum_api_version and get_current_api_version for
68
        details.
69
    :param wanted_api: The API version for which support is required.
3766.3.3 by Robert Collins
Review tweaks.
70
    :return: None
2550.2.3 by Robert Collins
Add require_api API.
71
    :raises IncompatibleAPI: When the wanted_api is not supported by
72
        object_with_api.
73
74
    Added in bzrlib 0.18.
75
    """
76
    current = get_current_api_version(object_with_api)
77
    minimum = get_minimum_api_version(object_with_api)
78
    if wanted_api < minimum or wanted_api > current:
79
        raise IncompatibleAPI(object_with_api, wanted_api, minimum, current)
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
80
3766.3.3 by Robert Collins
Review tweaks.
81
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
82
def require_any_api(object_with_api, wanted_api_list):
83
    """Check if object_with_api supports the api version wanted_api.
84
85
    :param object_with_api: An object which exports an API minimum and current
86
        version. See get_minimum_api_version and get_current_api_version for
87
        details.
88
    :param wanted_api: A list of API versions, any of which being available is
89
        sufficent.
3766.3.3 by Robert Collins
Review tweaks.
90
    :return: None
3766.3.1 by Robert Collins
Add bzrlib.api.require_any_api, fixing bug 279447.
91
    :raises IncompatibleAPI: When the wanted_api is not supported by
92
        object_with_api.
93
94
    Added in bzrlib 1.9.
95
    """
96
    for api in wanted_api_list[:-1]:
97
        try:
98
            return require_api(object_with_api, api)
99
        except IncompatibleAPI:
100
            pass
101
    require_api(object_with_api, wanted_api_list[-1])