Rev 4500: Restrict acceptable values for get_boolean. in file:///home/vila/src/bzr/experimental/cleanup-strict/

Vincent Ladeuil v.ladeuil+lp at free.fr
Tue Jun 30 13:28:22 BST 2009


At file:///home/vila/src/bzr/experimental/cleanup-strict/

------------------------------------------------------------
revno: 4500
revision-id: v.ladeuil+lp at free.fr-20090630122822-3m7ry9ogko40tc9i
parent: v.ladeuil+lp at free.fr-20090630083008-foex07e8ol983c95
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: cleanup-strict
timestamp: Tue 2009-06-30 14:28:22 +0200
message:
  Restrict acceptable values for get_boolean.
  
  * bzrlib/tests/test_ui.py:
  (TestStringAsBoolean.test_provided_values): Add test for
  bool_from_string.
  
  * bzrlib/ui/__init__.py:
  (bool_from_string): Accept a parameter specifying different
  acceptable values.
  (CLIUIFactory.get_boolean): Use a restricted set for acceptable
  boolean values.
-------------- next part --------------
=== modified file 'bzrlib/config.py'
--- a/bzrlib/config.py	2009-06-29 13:52:34 +0000
+++ b/bzrlib/config.py	2009-06-30 12:28:22 +0000
@@ -184,7 +184,7 @@
             interpreted as a boolean. Returns True or False ortherwise.
         """
         s = self._get_user_option(option_name)
-        return ui.string_as_boolean(s)
+        return ui.bool_from_string(s)
 
     def gpg_signing_command(self):
         """What program should be used to sign signatures?"""

=== modified file 'bzrlib/tests/test_ui.py'
--- a/bzrlib/tests/test_ui.py	2009-06-30 08:30:08 +0000
+++ b/bzrlib/tests/test_ui.py	2009-06-30 12:28:22 +0000
@@ -180,10 +180,6 @@
                                  "not an answer\nno\n" # False
                                  "I'm sure!\nyes\n" # True
                                  "NO\n" # False
-                                 "1\n" # True
-                                 "0\n" # False
-                                 "on\n" # True
-                                 "off\n" # False
                                  "foo\n")
         factory.stdout = StringIO()
         factory.stderr = StringIO()
@@ -194,10 +190,6 @@
         self.assertEqual(False, factory.get_boolean(""))
         self.assertEqual(True, factory.get_boolean(""))
         self.assertEqual(False, factory.get_boolean(""))
-        self.assertEqual(True, factory.get_boolean(""))
-        self.assertEqual(False, factory.get_boolean(""))
-        self.assertEqual(True, factory.get_boolean(""))
-        self.assertEqual(False, factory.get_boolean(""))
         self.assertEqual("foo\n", factory.stdin.read())
         # stdin should be empty
         self.assertEqual('', factory.stdin.readline())
@@ -367,16 +359,16 @@
 
 class TestStringAsBoolean(tests.TestCase):
 
-    def assertIsTrue(self, s):
-        res = _mod_ui.string_as_boolean(s)
+    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):
-        res = _mod_ui.string_as_boolean(s)
+    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):
-        res = _mod_ui.string_as_boolean(s)
+    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):
@@ -406,3 +398,16 @@
         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 08:30:08 +0000
+++ b/bzrlib/ui/__init__.py	2009-06-30 12:28:22 +0000
@@ -51,20 +51,28 @@
 _known_boolean_strings['0'] = False
 
 
-def string_as_boolean(s):
+def bool_from_string(s, accepted_values=None):
     """Returns a boolean if the string can be interpreted as such.
 
-    Interprets case insensitive strings as booleans, possible values: 'true',
-    'false', '0', '1', 'on', 'off', 'yes', 'no.
-
-    :param s: A string that should be interpreted as a boolean.
+    Interpret case insensitive strings as booleans, possible values: 'true',
+    'false', '0', '1', 'on', 'off', 'yes', 'no. The default values are suitable
+    for configuration files but can be overridden.
+
+    :param s: A string that should be interpreted as a boolean. It should be of
+        type string or unicode.
+
+    :param accepted_values: A 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 some known strings, None otherwise.
     """
+    if accepted_values is None:
+        accepted_values = _known_boolean_strings
     val = None
     if type(s) in (str, unicode):
         try:
-            val = _known_boolean_strings[s.lower()]
+            val = accepted_values[s.lower()]
         except KeyError:
             pass
     return val
@@ -183,11 +191,14 @@
         self.stdout = stdout or sys.stdout
         self.stderr = stderr or sys.stderr
 
+    _accepted_boolean_strings = dict(y=True, n=False, yes=True, no=False)
+
     def get_boolean(self, prompt):
         while True:
             self.prompt(prompt + "? [y/n]: ")
             line = self.stdin.readline()
-            val = string_as_boolean(line[:-1]) # strip \n
+            line = line.rstrip('\n')
+            val = bool_from_string(line, self._accepted_boolean_strings)
             if val is not None:
                 return val
 



More information about the bazaar-commits mailing list