diff options
author | Jan Gerber <j@mailb.org> | 2015-05-06 19:05:36 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2015-08-29 19:00:32 +0300 |
commit | 72f33fb8eddcc3adf994cf41661b1c93645a4150 (patch) | |
tree | 98965899a76c76bd465d32e5224818f3c5a93a50 | |
parent | db55ec1c5c60fd0c562a785b628ac49a08a52f27 (diff) | |
download | cliapp-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.
-rw-r--r-- | cliapp/settings.py | 27 | ||||
-rw-r--r-- | cliapp/settings_tests.py | 7 |
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): |