~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.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
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
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
17
"""The pure-python implementation of the StaticTuple type.
4679.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
18
19
Note that it is generally just implemented as using tuples of tuples of
20
strings.
21
"""
22
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
23
from __future__ import absolute_import
24
4679.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
25
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
26
class StaticTuple(tuple):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
27
    """A static type, similar to a tuple of strings."""
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
28
4771.1.1 by John Arbash Meinel
Don't allow extra attributes on the pure-python StaticTuple.
29
    __slots__ = ()
30
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
31
    def __new__(cls, *args):
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
32
        # Make the empty StaticTuple a singleton
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
33
        if not args and _empty_tuple is not None:
34
            return _empty_tuple
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
35
        return tuple.__new__(cls, args)
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
36
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
37
    def __init__(self, *args):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
38
        """Create a new 'StaticTuple'"""
4763.2.1 by Matt Nordhoff
Make the Python version raise a TypeError, and do the length check before the type checks, as the C version does.
39
        num_keys = len(args)
40
        if num_keys < 0 or num_keys > 255:
41
            raise TypeError('StaticTuple(...) takes from 0 to 255 items')
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
42
        for bit in args:
4759.2.9 by John Arbash Meinel
Implement support for lots of types.
43
            if type(bit) not in (str, StaticTuple, unicode, int, long, float,
4759.2.8 by John Arbash Meinel
Set up a test suite for hash() and richcompare against lots of acceptable types.
44
                                 None.__class__, bool):
45
                raise TypeError('StaticTuple can only point to'
4759.2.9 by John Arbash Meinel
Implement support for lots of types.
46
                    ' StaticTuple, str, unicode, int, long, float, bool, or'
47
                    ' None not %s' % (type(bit),))
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
48
        # We don't need to pass args to tuple.__init__, because that was
49
        # already handled in __new__.
50
        tuple.__init__(self)
51
4679.3.79 by John Arbash Meinel
Change the repr to print out 'StaticTuple'
52
    def __repr__(self):
53
        return '%s%s' % (self.__class__.__name__, tuple.__repr__(self))
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
54
4759.2.15 by Matt Nordhoff
Add a __reduce__ method to the Python version
55
    def __reduce__(self):
56
        return (StaticTuple, tuple(self))
57
4759.2.2 by John Arbash Meinel
Update _static_tuple_py.py with the same concatenation behavior
58
    def __add__(self, other):
59
        """Concatenate self with other"""
60
        return StaticTuple.from_sequence(tuple.__add__(self,other))
61
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
62
    def as_tuple(self):
4789.28.3 by John Arbash Meinel
Add a static_tuple.as_tuples() helper.
63
        return tuple(self)
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
64
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
65
    def intern(self):
4679.3.51 by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code.
66
        return _interned_tuples.setdefault(self, self)
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
67
4739.4.1 by John Arbash Meinel
Implement StaticTuple.from_sequence()
68
    @staticmethod
69
    def from_sequence(seq):
70
        """Convert a sequence object into a StaticTuple instance."""
71
        if isinstance(seq, StaticTuple):
72
            # it already is
73
            return seq
74
        return StaticTuple(*seq)
75
76
4679.3.16 by John Arbash Meinel
Initial work for a Key class.
77
4679.5.4 by John Arbash Meinel
Add a comment to help Matthew Nordhoff understand why we have:
78
# Have to set it to None first, so that __new__ can determine whether
79
# the _empty_tuple singleton has been created yet or not.
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
80
_empty_tuple = None
81
_empty_tuple = StaticTuple()
4679.3.51 by John Arbash Meinel
Add a _static_tuple_c.pxd file to define the C api to pyrex code.
82
_interned_tuples = {}