qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 11/27] qapi: improve reporting of unknown or


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v6 11/27] qapi: improve reporting of unknown or missing keys
Date: Wed, 05 Dec 2018 17:38:50 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

Marc-André Lureau <address@hidden> writes:

> Report the set of missing or unknown keys. And give a hint about the
> accepted keys.
>
> Signed-off-by: Marc-André Lureau <address@hidden>
> ---
>  scripts/qapi/common.py                  | 23 +++++++++++++++--------
>  tests/qapi-schema/alternate-base.err    |  1 +
>  tests/qapi-schema/double-type.err       |  1 +
>  tests/qapi-schema/unknown-expr-key.err  |  3 ++-
>  tests/qapi-schema/unknown-expr-key.json |  2 +-
>  5 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index 8313c478c4..cf8dab2866 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -874,14 +874,21 @@ def check_struct(expr, info):
>  
>  
>  def check_known_keys(info, source, keys, required, optional):
> -    for key in keys:
> -        if key not in required and key not in optional:
> -            raise QAPISemError(info, "Unknown key '%s' in %s" % (key, 
> source))
> -
> -    for key in required:
> -        if key not in keys:
> -            raise QAPISemError(info, "Key '%s' is missing from %s"
> -                               % (key, source))
> +
> +    def pprint(elems):
> +        return ', '.join("'" + e + "'" for e in sorted(elems))
> +
> +    missing = set(required) - set(keys)
> +    if missing:
> +        raise QAPISemError(info, "Key%s %s %s missing from %s"
> +                           % ('s' if len(missing) > 1 else '', 
> pprint(missing),
> +                              'are' if len(missing) > 1 else 'is', source))
> +    allowed = set(required + optional)
> +    unknown = set(keys) - allowed
> +    if unknown:
> +        raise QAPISemError(info, "Unknown key%s %s in %s\nValid keys are %s."
> +                           % ('s' if len(unknown) > 1 else '', 
> pprint(unknown),
> +                              source, pprint(allowed)))
>  
>  
>  def check_keys(expr_elem, meta, required, optional=[]):

I wouldn't habe bothered, but since you already wrote it...

> diff --git a/tests/qapi-schema/alternate-base.err 
> b/tests/qapi-schema/alternate-base.err
> index 30d8a34373..ebe05bc898 100644
> --- a/tests/qapi-schema/alternate-base.err
> +++ b/tests/qapi-schema/alternate-base.err
> @@ -1 +1,2 @@
>  tests/qapi-schema/alternate-base.json:4: Unknown key 'base' in alternate 
> 'Alt'
> +Valid keys are 'alternate', 'data', 'if'.
> diff --git a/tests/qapi-schema/double-type.err 
> b/tests/qapi-schema/double-type.err
> index f9613c6d6b..799193dba1 100644
> --- a/tests/qapi-schema/double-type.err
> +++ b/tests/qapi-schema/double-type.err
> @@ -1 +1,2 @@
>  tests/qapi-schema/double-type.json:2: Unknown key 'command' in struct 'bar'
> +Valid keys are 'base', 'data', 'if', 'struct'.

The error message is just as suboptimal as before in this case, and the
hint doesn't really help.  Can't say I care.

> diff --git a/tests/qapi-schema/unknown-expr-key.err 
> b/tests/qapi-schema/unknown-expr-key.err
> index 12f5ed5b43..83b83121e0 100644
> --- a/tests/qapi-schema/unknown-expr-key.err
> +++ b/tests/qapi-schema/unknown-expr-key.err
> @@ -1 +1,2 @@
> -tests/qapi-schema/unknown-expr-key.json:2: Unknown key 'bogus' in struct 
> 'bar'
> +tests/qapi-schema/unknown-expr-key.json:2: Unknown keys 'bogus', 'foo' in 
> struct 'bar'
> +Valid keys are 'base', 'data', 'if', 'struct'.
> diff --git a/tests/qapi-schema/unknown-expr-key.json 
> b/tests/qapi-schema/unknown-expr-key.json
> index 3b2be00cc4..5bcb8efd1d 100644
> --- a/tests/qapi-schema/unknown-expr-key.json
> +++ b/tests/qapi-schema/unknown-expr-key.json
> @@ -1,2 +1,2 @@
>  # we reject an expression with unknown top-level keys
> -{ 'struct': 'bar', 'data': { 'string': 'str'}, 'bogus': { } }
> +{ 'struct': 'bar', 'data': { 'string': 'str'}, 'bogus': { }, 'foo': { } }

Let's call the second unknown key 'phony'.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]