~cr3/checkbox-core/trunk

« back to all changes in this revision

Viewing changes to checkbox/lib/enum.py

  • Committer: Marc Tardif
  • Date: 2012-04-20 18:46:55 UTC
  • Revision ID: marc.tardif@canonical.com-20120420184655-1hl04prppvjvw8r3
Refactored Enum class to use __getitem__ instead of accessor functions.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
__all__ = [
22
22
    "Enum",
23
23
    "EnumError",
24
 
    "enum_name_to_value",
25
 
    "enum_value_to_names",
26
 
    "enum_value_to_name_string",
27
24
    ]
28
25
 
29
26
 
35
32
class Enum:
36
33
 
37
34
    def __init__(self, *names):
38
 
        self.__enum_values__ = {}
 
35
        self.__dict__["__values__"] = enum_values = {}
39
36
 
40
37
        value = 0
41
38
        unique_names = set()
44
41
                name, value = name
45
42
 
46
43
            if not isinstance(name, basestring):
47
 
                raise EnumError("enum name is not a string: %s" % name)
 
44
                raise EnumError("Enum name is not a string: %s" % name)
48
45
 
49
46
            if isinstance(value, basestring):
50
47
                if value not in unique_names:
51
 
                    raise EnumError("enum value does not define: %s" % value)
 
48
                    raise EnumError("Enum value does not define: %s" % value)
52
49
                value = getattr(self, value)
53
50
 
54
51
            if not isinstance(value, (int, long)):
55
 
                raise EnumError("enum value is not an integer: %s" % value)
 
52
                raise EnumError("Enum value is not an integer: %s" % value)
56
53
 
57
54
            if name in unique_names:
58
 
                raise EnumError("enum name is not unique: %s" % name)
 
55
                raise EnumError("Enum name is not unique: %s" % name)
59
56
 
60
57
            # Add name to attributes
61
58
            unique_names.add(name)
62
 
            setattr(self, name, value)
 
59
            self.__dict__[name] = value
63
60
 
64
61
            # Add value to private dictionary
65
 
            values = self.__enum_values__.setdefault(value, [])
 
62
            values = enum_values.setdefault(value, [])
66
63
            values.append(name)
67
64
 
68
65
            value += 1
69
66
 
70
 
 
71
 
def enum_name_to_value(enum, name):
72
 
    try:
73
 
        return getattr(enum, name)
74
 
    except AttributeError:
75
 
        raise EnumError("enum name unknown: %s" % name)
76
 
 
77
 
 
78
 
def enum_value_to_names(enum, value):
79
 
    try:
80
 
        return enum.__enum_values__[value]
81
 
    except KeyError:
82
 
        raise EnumError("enum value unknown: %s" % value)
83
 
 
84
 
 
85
 
def enum_value_to_name_string(enum, value):
86
 
    names = enum_value_to_names(enum, value)
87
 
    if len(names) > 2:
88
 
        names[:-1] = [", ".join(names[:-1])]
89
 
 
90
 
    return " or ".join(names)
 
67
    def __setattr__(self, name, value):
 
68
        raise EnumError("Enum does not support setting attributes.")
 
69
 
 
70
    def __delattr__(self, name):
 
71
        raise EnumError("Enum does not support deleting attributes.")
 
72
 
 
73
    def __len__(self):
 
74
        return len(self.__values__)
 
75
 
 
76
    def __getitem__(self, index):
 
77
        try:
 
78
            names = self.__values__[index]
 
79
        except KeyError:
 
80
            raise EnumError("Enum index out of range")
 
81
 
 
82
        if len(names) > 2:
 
83
            names[:-1] = [", ".join(names[:-1])]
 
84
 
 
85
        return " or ".join(names)
 
86
 
 
87
    def __setitem__(self, index, value):
 
88
        raise EnumError("Enum does not support setting items.")
 
89
 
 
90
    def __delitem__(self, index):
 
91
        raise EnumError("Enum does not support deleting items.")
 
92
 
 
93
    def __iter__(self):
 
94
        return self.__values__.iterkeys()
 
95
 
 
96
    def __contains__(self, value):
 
97
        if isinstance(value, basestring):
 
98
            for names in self.__values__.itervalues():
 
99
                if value in names:
 
100
                    return True
 
101
            else:
 
102
                return False
 
103
        else:
 
104
            return value in self.__values__.iterkeys()