summaryrefslogtreecommitdiff
path: root/gbp/tristate.py
blob: ae47d03f6f752e8fc4fabd318d0765465ab0154b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# vim: set fileencoding=utf-8 :
#
# (C) 2011 Guido Guenther <agx@sigxcpu.org>
#    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

class Tristate(object):
    """Tri-state value: on, off or auto"""
    AUTO = -1
    ON  = True
    OFF = False
    # We accept true as alias for on and false as alias for off
    _VALID_NAMES = [ 'on', 'off', 'true', 'false', 'auto' ]

    def __init__(self, val):
        if type(val) in [ type(t) for t in (True, 1) ]:
            if val > 0:
                self._state = self.ON
            elif val < 0:
                self._state = self.AUTO
            else:
                self._state = self.OFF
        elif type(val) in [ type(t) for t in ("", u"") ]:
            if val.lower() in [ 'on', 'true' ]:
                self._state = self.ON
            elif val.lower() in [ 'auto' ]:
                self._state = self.AUTO
            else:
                self._state = self.OFF
        else:
            raise TypeError

    def __repr__(self):
        if self._state == ON:
            return "on"
        elif self._state == AUTO:
            return "auto"
        else:
            return "off"

    @classmethod
    def is_valid_state(self, stat):
        if state.lower() in self._VALID_NAMES:
            return True

    def is_auto(self):
        return [False, True][self._state == self.AUTO]

    def is_on(self):
        return [False, True][self._state == self.ON]

    def is_off(self):
        return [False, True][self._state == self.OFF]