aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreterbase
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2021-06-08 11:40:43 -0700
committerDylan Baker <dylan@pnwbakers.com>2021-06-14 12:30:02 -0700
commit5bb75dc3af4d1b91af024e70d9cb2432886eb959 (patch)
tree9893578621ffd634f71256a1a08ba6649d225d69 /mesonbuild/interpreterbase
parent6490b13f2283debf5c166c1ae252bba105470bc5 (diff)
downloadmeson-5bb75dc3af4d1b91af024e70d9cb2432886eb959.zip
meson-5bb75dc3af4d1b91af024e70d9cb2432886eb959.tar.gz
meson-5bb75dc3af4d1b91af024e70d9cb2432886eb959.tar.bz2
interpreterbase: Add deprecated_values and since_values to KwargInfo
This allows checking specific values that are added or deprecated, which we do a surprising amount of. This works with both containers and scalar values
Diffstat (limited to 'mesonbuild/interpreterbase')
-rw-r--r--mesonbuild/interpreterbase/decorators.py30
1 files changed, 30 insertions, 0 deletions
diff --git a/mesonbuild/interpreterbase/decorators.py b/mesonbuild/interpreterbase/decorators.py
index f997111..b82a413 100644
--- a/mesonbuild/interpreterbase/decorators.py
+++ b/mesonbuild/interpreterbase/decorators.py
@@ -290,13 +290,19 @@ class KwargInfo(T.Generic[_T]):
different type. This is intended for cases such as the meson DSL using a
string, but the implementation using an Enum. This should not do
validation, just converstion.
+ :param deprecated_values: a dictionary mapping a value to the version of
+ meson it was deprecated in.
+ :param since: a dictionary mapping a value to the version of meson it was
+ added in.
"""
def __init__(self, name: str, types: T.Union[T.Type[_T], T.Tuple[T.Type[_T], ...], ContainerTypeInfo],
*, required: bool = False, listify: bool = False,
default: T.Optional[_T] = None,
since: T.Optional[str] = None,
+ since_values: T.Optional[T.Dict[str, str]] = None,
deprecated: T.Optional[str] = None,
+ deprecated_values: T.Optional[T.Dict[str, str]] = None,
validator: T.Optional[T.Callable[[_T], T.Optional[str]]] = None,
convertor: T.Optional[T.Callable[[_T], TYPE_nvar]] = None):
self.name = name
@@ -304,8 +310,10 @@ class KwargInfo(T.Generic[_T]):
self.required = required
self.listify = listify
self.default = default
+ self.since_values = since_values
self.since = since
self.deprecated = deprecated
+ self.deprecated_values = deprecated_values
self.validator = validator
self.convertor = convertor
@@ -368,6 +376,28 @@ def typed_kwargs(name: str, *types: KwargInfo) -> T.Callable[..., T.Any]:
msg = info.validator(value)
if msg is not None:
raise InvalidArguments(f'{name} keyword argument "{info.name}" {msg}')
+
+ warn: bool
+ if info.deprecated_values is not None:
+ for n, version in info.deprecated_values.items():
+ if isinstance(value, (dict, list)):
+ warn = n in value
+ else:
+ warn = n == value
+
+ if warn:
+ FeatureDeprecated.single_use(f'"{name}" keyword argument "{info.name}" value "{n}"', version, subproject)
+
+ if info.since_values is not None:
+ for n, version in info.since_values.items():
+ if isinstance(value, (dict, list)):
+ warn = n in value
+ else:
+ warn = n == value
+
+ if warn:
+ FeatureNew.single_use(f'"{name}" keyword argument "{info.name}" value "{n}"', version, subproject)
+
elif info.required:
raise InvalidArguments(f'{name} is missing required keyword argument "{info.name}"')
else: