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