Add Tristate class that allows for on, off and auto
authorGuido Günther <agx@sigxcpu.org>
Sat, 8 Jan 2011 12:33:31 +0000 (13:33 +0100)
committerGuido Günther <agx@sigxcpu.org>
Sat, 8 Jan 2011 14:23:09 +0000 (15:23 +0100)
Git-Dch: Ignore

gbp/tristate.py [new file with mode: 0644]

diff --git a/gbp/tristate.py b/gbp/tristate.py
new file mode 100644 (file)
index 0000000..ae47d03
--- /dev/null
@@ -0,0 +1,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]
+