Rev 4504: Get a bool from a string. in file:///home/vila/src/bzr/experimental/bool-config-option/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Jul 2 09:52:35 BST 2009


At file:///home/vila/src/bzr/experimental/bool-config-option/

------------------------------------------------------------
revno: 4504
revision-id: v.ladeuil+lp at free.fr-20090702085235-85fqq4q5d3bt5w7u
parent: pqm at pqm.ubuntu.com-20090702075724-9zff533wsm7xszzy
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: bool-config-option
timestamp: Thu 2009-07-02 10:52:35 +0200
message:
  Get a bool from a string.
  
  * bzrlib/tests/test_ui.py:
  (TestBoolFromString): Test bool to string conversions.
  
  * bzrlib/ui/__init__.py:
  (bool_from_string): Interpret string as a boolean, if possible.
-------------- next part --------------
=== modified file 'bzrlib/tests/test_ui.py'
--- a/bzrlib/tests/test_ui.py	2009-06-30 05:34:47 +0000
+++ b/bzrlib/tests/test_ui.py	2009-07-02 08:52:35 +0000
@@ -355,3 +355,58 @@
             r'[####|               ] a:b:c 1/2'
             , uif._progress_view._render_line())
 
+
+class TestBoolFromString(tests.TestCase):
+
+    def assertIsTrue(self, s, accepted_values=None):
+        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
+        self.assertEquals(True, res)
+
+    def assertIsFalse(self, s, accepted_values=None):
+        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
+        self.assertEquals(False, res)
+
+    def assertIsNone(self, s, accepted_values=None):
+        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
+        self.assertIs(None, res)
+
+    def test_know_valid_values(self):
+        self.assertIsTrue('true')
+        self.assertIsFalse('false')
+        self.assertIsTrue('1')
+        self.assertIsFalse('0')
+        self.assertIsTrue('on')
+        self.assertIsFalse('off')
+        self.assertIsTrue('yes')
+        self.assertIsFalse('no')
+        self.assertIsTrue('y')
+        self.assertIsFalse('n')
+        # Also try some case variations
+        self.assertIsTrue('True')
+        self.assertIsFalse('False')
+        self.assertIsTrue('On')
+        self.assertIsFalse('Off')
+        self.assertIsTrue('ON')
+        self.assertIsFalse('OFF')
+        self.assertIsTrue('oN')
+        self.assertIsFalse('oFf')
+
+    def test_invalid_values(self):
+        self.assertIsNone(None)
+        self.assertIsNone('doubt')
+        self.assertIsNone('frue')
+        self.assertIsNone('talse')
+        self.assertIsNone('42')
+
+    def test_provided_values(self):
+        av = dict(y=True, n=False, yes=True, no=False)
+        self.assertIsTrue('y', av)
+        self.assertIsTrue('Y', av)
+        self.assertIsTrue('Yes', av)
+        self.assertIsFalse('n', av)
+        self.assertIsFalse('N', av)
+        self.assertIsFalse('No', av)
+        self.assertIsNone('1', av)
+        self.assertIsNone('0', av)
+        self.assertIsNone('on', av)
+        self.assertIsNone('off', av)

=== modified file 'bzrlib/ui/__init__.py'
--- a/bzrlib/ui/__init__.py	2009-06-30 05:34:47 +0000
+++ b/bzrlib/ui/__init__.py	2009-07-02 08:52:35 +0000
@@ -43,6 +43,42 @@
 """)
 
 
+_valid_boolean_strings = dict(yes=True, no=False,
+                              y=True, n=False,
+                              on=True, off=False,
+                              true=True, false=False)
+_valid_boolean_strings['1'] = True
+_valid_boolean_strings['0'] = False
+
+
+def bool_from_string(s, accepted_values=None):
+    """Returns a boolean if the string can be interpreted as such.
+
+    Interpret case insensitive strings as booleans. The default values
+    includes: 'yes', 'no, 'y', 'n', 'true', 'false', '0', '1', 'on',
+    'off'. Alternative values can be provided with the 'accepted_values'
+    parameter.
+
+    :param s: A string that should be interpreted as a boolean. It should be of
+        type string or unicode.
+
+    :param accepted_values: An optional dict with accepted strings as keys and
+        True/False as values. The strings will be tested against a lowered
+        version of 's'.
+
+    :return: True or False for accepted strings, None otherwise.
+    """
+    if accepted_values is None:
+        accepted_values = _valid_boolean_strings
+    val = None
+    if type(s) in (str, unicode):
+        try:
+            val = accepted_values[s.lower()]
+        except KeyError:
+            pass
+    return val
+
+
 class UIFactory(object):
     """UI abstraction.
 



More information about the bazaar-commits mailing list