diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-10-07 18:09:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-07 18:09:13 +0300 |
commit | d2022f9c654e0098f17656ee39b9ec2193d03326 (patch) | |
tree | 0e5a2935fb7250e61edd3dfce6a53e09bdefb5fa /mesonbuild/optinterpreter.py | |
parent | 93d2ced31f9e23491ce010161475956b795a6235 (diff) | |
parent | 7dfad54f06da5af187ce81faf03f1c62741aa30e (diff) | |
download | meson-d2022f9c654e0098f17656ee39b9ec2193d03326.zip meson-d2022f9c654e0098f17656ee39b9ec2193d03326.tar.gz meson-d2022f9c654e0098f17656ee39b9ec2193d03326.tar.bz2 |
Merge pull request #2426 from dcbaker/submit/options-permitted-kwargs
options: Add a permitted_kwargs function
Diffstat (limited to 'mesonbuild/optinterpreter.py')
-rw-r--r-- | mesonbuild/optinterpreter.py | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/mesonbuild/optinterpreter.py b/mesonbuild/optinterpreter.py index ac27269..4b8e147 100644 --- a/mesonbuild/optinterpreter.py +++ b/mesonbuild/optinterpreter.py @@ -12,10 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os, re +import functools + from . import mparser from . import coredata from . import mesonlib -import os, re + forbidden_option_names = coredata.get_builtin_options() forbidden_prefixes = {'c_', @@ -43,15 +46,33 @@ def is_invalid_name(name): class OptionException(mesonlib.MesonException): pass + +def permitted_kwargs(permitted): + """Function that validates kwargs for options.""" + def _wraps(func): + @functools.wraps(func) + def _inner(name, description, kwargs): + bad = [a for a in kwargs.keys() if a not in permitted] + if bad: + raise OptionException('Invalid kwargs for option "{}": "{}"'.format( + name, ' '.join(bad))) + return func(name, description, kwargs) + return _inner + return _wraps + + optname_regex = re.compile('[^a-zA-Z0-9_-]') +@permitted_kwargs({'value'}) def StringParser(name, description, kwargs): return coredata.UserStringOption(name, description, kwargs.get('value', ''), kwargs.get('choices', [])) +@permitted_kwargs({'value'}) def BooleanParser(name, description, kwargs): return coredata.UserBooleanOption(name, description, kwargs.get('value', True)) +@permitted_kwargs({'value', 'choices'}) def ComboParser(name, description, kwargs): if 'choices' not in kwargs: raise OptionException('Combo option missing "choices" keyword.') @@ -141,7 +162,7 @@ class OptionInterpreter: (posargs, kwargs) = self.reduce_arguments(node.args) if 'type' not in kwargs: raise OptionException('Option call missing mandatory "type" keyword argument') - opt_type = kwargs['type'] + opt_type = kwargs.pop('type') if opt_type not in option_types: raise OptionException('Unknown type %s.' % opt_type) if len(posargs) != 1: @@ -155,7 +176,7 @@ class OptionInterpreter: raise OptionException('Option name %s is reserved.' % opt_name) if self.subproject != '': opt_name = self.subproject + ':' + opt_name - opt = option_types[opt_type](opt_name, kwargs.get('description', ''), kwargs) + opt = option_types[opt_type](opt_name, kwargs.pop('description', ''), kwargs) if opt.description == '': opt.description = opt_name if opt_name in self.cmd_line_options: |