/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
25
import sys
26
4679.3.5 by John Arbash Meinel
Have a pure-python implementation that works as tuples of tuples of strings,
27
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
28
class StaticTuple(tuple):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
29
    """A static type, similar to a tuple of strings."""
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
30
4771.1.1 by John Arbash Meinel
Don't allow extra attributes on the pure-python StaticTuple.
31
    __slots__ = ()
32
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
33
    def __new__(cls, *args):
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
34
        # Make the empty StaticTuple a singleton
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
35
        if not args and _empty_tuple is not None:
36
            return _empty_tuple
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
37
        return tuple.__new__(cls, args)
4679.3.44 by John Arbash Meinel
Special case the empty tuple as a singleton.
38
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
39
    def __init__(self, *args):
4679.3.41 by John Arbash Meinel
Finish switching the naming to StaticTuple.
40
        """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.
41
        num_keys = len(args)
42
        if num_keys < 0 or num_keys > 255:
43
            raise TypeError('StaticTuple(...) takes from 0 to 255 items')
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
44
        for bit in args:
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
45
            if type(bit) not in _valid_types:
4759.2.8 by John Arbash Meinel
Set up a test suite for hash() and richcompare against lots of acceptable types.
46
                raise TypeError('StaticTuple can only point to'
7143.15.2 by Jelmer Vernooij
Run autopep8.
47
                                ' StaticTuple, str, unicode, int, float, bool, or'
48
                                ' None not %s' % (type(bit),))
4679.3.78 by John Arbash Meinel
Change the pure-python version of StaticTuple
49
        # We don't need to pass args to tuple.__init__, because that was
50
        # already handled in __new__.
51
        tuple.__init__(self)
52
4679.3.79 by John Arbash Meinel
Change the repr to print out 'StaticTuple'
53
    def __repr__(self):
54
        return '%s%s' % (self.__class__.__name__, tuple.__repr__(self))
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
55
4759.2.15 by Matt Nordhoff
Add a __reduce__ method to the Python version
56
    def __reduce__(self):
57
        return (StaticTuple, tuple(self))
58
4759.2.2 by John Arbash Meinel
Update _static_tuple_py.py with the same concatenation behavior
59
    def __add__(self, other):
60
        """Concatenate self with other"""
6809.1.1 by Martin
Apply 2to3 ws_comma fixer
61
        return StaticTuple.from_sequence(tuple.__add__(self, other))
4759.2.2 by John Arbash Meinel
Update _static_tuple_py.py with the same concatenation behavior
62
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
63
    def as_tuple(self):
4789.28.3 by John Arbash Meinel
Add a static_tuple.as_tuples() helper.
64
        return tuple(self)
4679.3.29 by John Arbash Meinel
Start work on implementing a Key.intern() function.
65
4679.3.30 by John Arbash Meinel
Interning with a regular 'dict' is a tradeoff for bzr.dev of:
66
    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.
67
        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:
68
4739.4.1 by John Arbash Meinel
Implement StaticTuple.from_sequence()
69
    @staticmethod
70
    def from_sequence(seq):
71
        """Convert a sequence object into a StaticTuple instance."""
72
        if isinstance(seq, StaticTuple):
73
            # it already is
74
            return seq
75
        return StaticTuple(*seq)
76
77
6621.18.1 by Martin
Remove or fix use of long type and nearby type issues
78
_valid_types = (bytes, str, StaticTuple, int, float, None.__class__, bool)
79
if sys.version_info < (3,):
80
    _valid_types += (long, unicode)
81
4679.3.16 by John Arbash Meinel
Initial work for a Key class.
82
4679.5.4 by John Arbash Meinel
Add a comment to help Matthew Nordhoff understand why we have:
83
# Have to set it to None first, so that __new__ can determine whether
84
# 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.
85
_empty_tuple = None
86
_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.
87
_interned_tuples = {}