~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2009, 2010 Canonical Ltd
4679.8.3 by John Arbash Meinel
Expose bzrlib.static_tuple.StaticTuple as a thunk
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Interface thunk for a StaticTuple implementation."""
18
6379.6.3 by Jelmer Vernooij
Use absolute_import.
19
from __future__ import absolute_import
20
4668.3.1 by John Arbash Meinel
Fix bug #471193, allow tuples into the CHK code.
21
from bzrlib import debug
22
4679.8.3 by John Arbash Meinel
Expose bzrlib.static_tuple.StaticTuple as a thunk
23
try:
24
    from bzrlib._static_tuple_c import StaticTuple
25
except ImportError, e:
26
    from bzrlib import osutils
27
    osutils.failed_to_load_extension(e)
28
    from bzrlib._static_tuple_py import StaticTuple
29
4668.3.1 by John Arbash Meinel
Fix bug #471193, allow tuples into the CHK code.
30
31
def expect_static_tuple(obj):
32
    """Check if the passed object is a StaticTuple.
33
34
    Cast it if necessary, but if the 'static_tuple' debug flag is set, raise an
35
    error instead.
4668.3.3 by John Arbash Meinel
Review feedback, add a docstring that we want to get rid of this eventually.
36
37
    As apis are improved, we will probably eventually stop calling this as it
38
    adds overhead we shouldn't need.
4668.3.1 by John Arbash Meinel
Fix bug #471193, allow tuples into the CHK code.
39
    """
40
    if 'static_tuple' not in debug.debug_flags:
41
        return StaticTuple.from_sequence(obj)
42
    if type(obj) is not StaticTuple:
43
        raise TypeError('We expected a StaticTuple not a %s' % (type(obj),))
44
    return obj
4789.28.3 by John Arbash Meinel
Add a static_tuple.as_tuples() helper.
45
46
47
def as_tuples(obj):
48
    """Ensure that the object and any referenced objects are plain tuples.
49
50
    :param obj: a list, tuple or StaticTuple
51
    :return: a plain tuple instance, with all children also being tuples.
52
    """
53
    result = []
54
    for item in obj:
55
        if isinstance(item, (tuple, list, StaticTuple)):
56
            item = as_tuples(item)
57
        result.append(item)
58
    return tuple(result)