# Copyright (C) 2009, 2010 Canonical Ltd # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA """Interface thunk for a StaticTuple implementation.""" from __future__ import absolute_import from bzrlib import debug try: from bzrlib._static_tuple_c import StaticTuple except ImportError, e: from bzrlib import osutils osutils.failed_to_load_extension(e) from bzrlib._static_tuple_py import StaticTuple def expect_static_tuple(obj): """Check if the passed object is a StaticTuple. Cast it if necessary, but if the 'static_tuple' debug flag is set, raise an error instead. As apis are improved, we will probably eventually stop calling this as it adds overhead we shouldn't need. """ if 'static_tuple' not in debug.debug_flags: return StaticTuple.from_sequence(obj) if type(obj) is not StaticTuple: raise TypeError('We expected a StaticTuple not a %s' % (type(obj),)) return obj def as_tuples(obj): """Ensure that the object and any referenced objects are plain tuples. :param obj: a list, tuple or StaticTuple :return: a plain tuple instance, with all children also being tuples. """ result = [] for item in obj: if isinstance(item, (tuple, list, StaticTuple)): item = as_tuples(item) result.append(item) return tuple(result)