summaryrefslogtreecommitdiff
path: root/cliapp
diff options
context:
space:
mode:
authorJan Gerber <j@mailb.org>2015-05-06 19:05:36 +0200
committerLars Wirzenius <liw@liw.fi>2015-08-29 19:00:32 +0300
commit72f33fb8eddcc3adf994cf41661b1c93645a4150 (patch)
tree98965899a76c76bd465d32e5224818f3c5a93a50 /cliapp
parentdb55ec1c5c60fd0c562a785b628ac49a08a52f27 (diff)
downloadcliapp-72f33fb8eddcc3adf994cf41661b1c93645a4150.tar.gz
Allow comma in StringListSetting values
- Escape values with comma with double quotes in config syntax. - Don't split values passed as arguments.
Diffstat (limited to 'cliapp')
-rw-r--r--cliapp/settings.py27
-rw-r--r--cliapp/settings_tests.py7
2 files changed, 24 insertions, 10 deletions
diff --git a/cliapp/settings.py b/cliapp/settings.py
index c272a78..d9e5ba7 100644
--- a/cliapp/settings.py
+++ b/cliapp/settings.py
@@ -105,30 +105,41 @@ class StringListSetting(Setting):
self, names, [], help_text, metavar=metavar, group=group,
hidden=hidden)
self.default = default
+ self._strings = self.default or []
self.using_default_value = True
def default_metavar(self):
return self.names[0].upper()
def get_value(self):
- if self._string_value.strip():
- return [s.strip() for s in self._string_value.split(',')]
- else:
- return self.default
+ return self._strings
def set_value(self, strings):
- self._string_value = ','.join(strings)
+ self._strings = strings
self.using_default_value = False
def has_value(self):
return self.value != []
def parse_value(self, string):
- self.value = [s.strip() for s in string.split(',')]
+ values = []
+ value = ''
+ inside_quote = False
+ for c in string:
+ if c == '"':
+ inside_quote = not inside_quote
+ elif c == ',' and not inside_quote:
+ values.append(value)
+ value = ''
+ else:
+ value += c
+ if value:
+ values.append(value)
+ self.value = [v.strip() for v in values]
def format(self): # pragma: no cover
- return ', '.join(self.value)
-
+ values = ['"%s"' % v if ',' in v else v for v in self.value]
+ return ', '.join(values)
class ChoiceSetting(Setting):
diff --git a/cliapp/settings_tests.py b/cliapp/settings_tests.py
index e1c4fa8..9284eec 100644
--- a/cliapp/settings_tests.py
+++ b/cliapp/settings_tests.py
@@ -278,14 +278,17 @@ foo = yeehaa
[config]
foo = yeehaa
bar = ping, pong
+comma = ping, pong, "foo,bar"
''')
self.settings.string_list(['foo'], 'foo help')
self.settings.string_list(['bar'], 'bar help')
+ self.settings.string_list(['comma'], 'comma help')
self.settings.config_files = ['whatever.conf']
self.settings.load_configs(open_file=mock_open)
self.assertEqual(self.settings['foo'], ['yeehaa'])
self.assertEqual(self.settings['bar'], ['ping', 'pong'])
+ self.assertEqual(self.settings['comma'], ['ping', 'pong', 'foo,bar'])
def test_handles_defaults_with_config_files(self):
@@ -330,9 +333,9 @@ bar = ping, pong
self.settings.string_list(['bar'], 'bar help', default=['bar'])
self.settings.config_files = ['whatever.conf']
self.settings.load_configs(open_file=mock_open)
- self.settings.parse_args(['--foo=red', '--bar=blue', '--bar=white'])
+ self.settings.parse_args(['--foo=red', '--bar=blue', '--bar=white,comma'])
self.assertEqual(self.settings['foo'], 'red')
- self.assertEqual(self.settings['bar'], ['blue', 'white'])
+ self.assertEqual(self.settings['bar'], ['blue', 'white,comma'])
def test_load_configs_raises_error_for_unknown_variable(self):