aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2017-10-04 09:39:30 -0700
committerDylan Baker <dylan@pnwbakers.com>2017-10-04 09:53:06 -0700
commit7dfad54f06da5af187ce81faf03f1c62741aa30e (patch)
tree14c60f1fcc8c549852a72ae70355d329cc29382a
parent4e18483ff3ea63b38a18efcaa86227b3488cb9b7 (diff)
downloadmeson-7dfad54f06da5af187ce81faf03f1c62741aa30e.zip
meson-7dfad54f06da5af187ce81faf03f1c62741aa30e.tar.gz
meson-7dfad54f06da5af187ce81faf03f1c62741aa30e.tar.bz2
options: Add a permitted_kwargs function
I've typo'd "value" for the last time, options needs a kwargs validator. This validator is slightly different than the one used by the main parser, since it operates on a much simpler representation than the other one does, and they are not interchangeable. This also changes the optinterpreter to use pop on 'type' and 'description' so that they're not passed to the validator as kwargs.
-rw-r--r--mesonbuild/optinterpreter.py27
-rw-r--r--test cases/failing/62 bad option argument/meson.build3
-rw-r--r--test cases/failing/62 bad option argument/meson_options.txt1
3 files changed, 28 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:
diff --git a/test cases/failing/62 bad option argument/meson.build b/test cases/failing/62 bad option argument/meson.build
new file mode 100644
index 0000000..5219cfb
--- /dev/null
+++ b/test cases/failing/62 bad option argument/meson.build
@@ -0,0 +1,3 @@
+project('bad option')
+
+get_option('name')
diff --git a/test cases/failing/62 bad option argument/meson_options.txt b/test cases/failing/62 bad option argument/meson_options.txt
new file mode 100644
index 0000000..de1fff6
--- /dev/null
+++ b/test cases/failing/62 bad option argument/meson_options.txt
@@ -0,0 +1 @@
+option('name', type : 'string', vaule : 'foo')