diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2017-09-29 10:07:29 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2017-11-29 14:14:41 -0800 |
commit | c9351ce30c03d107279090da7825096951a705d3 (patch) | |
tree | a9bf94236755986b2f69d2ef297e339c3c898561 /mesonbuild | |
parent | 7c779a76df9b8a4dd466b120f817b50f857081fa (diff) | |
download | meson-c9351ce30c03d107279090da7825096951a705d3.zip meson-c9351ce30c03d107279090da7825096951a705d3.tar.gz meson-c9351ce30c03d107279090da7825096951a705d3.tar.bz2 |
Add new array type option
This exposes the already existing UserStringArrayOption class through
the meson_options.txt. The intention is to provide a way for projects to
take list/array type arguments and validate that all of the elements in
that array are valid without using complex looping constructrs.
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/coredata.py | 33 | ||||
-rw-r--r-- | mesonbuild/optinterpreter.py | 16 |
2 files changed, 39 insertions, 10 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 401211a..af5a19a 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -127,24 +127,37 @@ class UserComboOption(UserOption): class UserStringArrayOption(UserOption): def __init__(self, name, description, value, **kwargs): super().__init__(name, description, kwargs.get('choices', [])) - self.set_value(value) - - def validate(self, value): - if isinstance(value, str): - if not value.startswith('['): - raise MesonException('Valuestring does not define an array: ' + value) - newvalue = ast.literal_eval(value) + self.set_value(value, user_input=False) + + def validate(self, value, user_input): + # User input is for options defined on the command line (via -D + # options). Users should put their input in as a comma separated + # string, but for defining options in meson_options.txt the format + # should match that of a combo + if not user_input: + if isinstance(value, str): + if not value.startswith('['): + raise MesonException('Valuestring does not define an array: ' + value) + newvalue = ast.literal_eval(value) + else: + newvalue = value else: - newvalue = value + assert isinstance(value, str) + newvalue = [v.strip() for v in value.split(',')] if not isinstance(newvalue, list): raise MesonException('"{0}" should be a string array, but it is not'.format(str(newvalue))) for i in newvalue: if not isinstance(i, str): raise MesonException('String array element "{0}" is not a string.'.format(str(newvalue))) + if self.choices: + bad = [x for x in newvalue if x not in self.choices] + if bad: + raise MesonException('Options "{}" are not in allowed choices: "{}"'.format( + ', '.join(bad), ', '.join(self.choices))) return newvalue - def set_value(self, newvalue): - self.value = self.validate(newvalue) + def set_value(self, newvalue, user_input=True): + self.value = self.validate(newvalue, user_input) def validate_value(self, value): self.validate(value) diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index 01dd036..22a263e 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -84,9 +84,25 @@ def ComboParser(name, description, kwargs): raise OptionException('Combo choice elements must be strings.') return coredata.UserComboOption(name, description, choices, kwargs.get('value', choices[0])) +@permitted_kwargs({'value', 'choices'}) +def string_array_parser(name, description, kwargs): + if 'choices' not in kwargs: + raise OptionException('Array option missing "choices" keyword.') + choices = kwargs['choices'] + if not isinstance(choices, list): + raise OptionException('Array choices must be an array.') + for i in choices: + if not isinstance(i, str): + raise OptionException('Array choice elements must be strings.') + value = kwargs.get('value', choices) + if not isinstance(value, list): + raise OptionException('Array choices must be passed as an array.') + return coredata.UserStringArrayOption(name, description, value, choices=choices) + option_types = {'string': StringParser, 'boolean': BooleanParser, 'combo': ComboParser, + 'array': string_array_parser, } class OptionInterpreter: |