qapi: Have each QAPI schema declare its name rule violations
qapi.py has a hardcoded white-list of type names that may violate the rule on use of upper and lower case. Add a new pragma directive 'name-case-whitelist', and use it to replace the hard-coded white-list. Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <1489582656-31133-7-git-send-email-armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
1554a8fae9
commit
2cfbae3c42
@ -252,6 +252,9 @@ Any name (command, event, type, member, or enum value) beginning with
|
||||
"x-" is marked experimental, and may be withdrawn or changed
|
||||
incompatibly in a future release.
|
||||
|
||||
Pragma 'name-case-whitelist' lets you violate the rules on use of
|
||||
upper and lower case. Use for new code is strongly discouraged.
|
||||
|
||||
In the rest of this document, usage lines are given for each
|
||||
expression type, with literal strings written in lower case and
|
||||
placeholders written in capitals. If a literal string includes a
|
||||
@ -321,6 +324,9 @@ is required. Default is false.
|
||||
Pragma 'returns-whitelist' takes a list of command names that may
|
||||
violate the rules on permitted return types. Default is none.
|
||||
|
||||
Pragma 'name-case-whitelist' takes a list of names that may violate
|
||||
rules on use of upper- vs. lower-case letters. Default is none.
|
||||
|
||||
|
||||
=== Struct types ===
|
||||
|
||||
|
@ -61,7 +61,16 @@
|
||||
'query-migrate-cache-size',
|
||||
'query-tpm-models',
|
||||
'query-tpm-types',
|
||||
'ringbuf-read' ] } }
|
||||
'ringbuf-read' ],
|
||||
'name-case-whitelist': [
|
||||
'ACPISlotType', # DIMM, visible through query-acpi-ospm-status
|
||||
'CpuInfoMIPS', # PC, visible through query-cpu
|
||||
'CpuInfoTricore', # PC, visible through query-cpu
|
||||
'QapiErrorClass', # all members, visible through errors
|
||||
'UuidInfo', # UUID, visible through query-uuid
|
||||
'X86CPURegister32', # all members, visible indirectly through qom-get
|
||||
'q_obj_CpuInfo-base' # CPU, visible through query-cpu
|
||||
] } }
|
||||
|
||||
# QAPI common definitions
|
||||
{ 'include': 'qapi/common.json' }
|
||||
|
@ -44,16 +44,7 @@ doc_required = False
|
||||
returns_whitelist = []
|
||||
|
||||
# Whitelist of entities allowed to violate case conventions
|
||||
case_whitelist = [
|
||||
# From QMP:
|
||||
'ACPISlotType', # DIMM, visible through query-acpi-ospm-status
|
||||
'CpuInfoMIPS', # PC, visible through query-cpu
|
||||
'CpuInfoTricore', # PC, visible through query-cpu
|
||||
'QapiErrorClass', # all members, visible through errors
|
||||
'UuidInfo', # UUID, visible through query-uuid
|
||||
'X86CPURegister32', # all members, visible indirectly through qom-get
|
||||
'q_obj_CpuInfo-base', # CPU, visible through query-cpu
|
||||
]
|
||||
name_case_whitelist = []
|
||||
|
||||
enum_types = []
|
||||
struct_types = []
|
||||
@ -302,7 +293,7 @@ class QAPISchemaParser(object):
|
||||
self.docs.extend(exprs_include.docs)
|
||||
|
||||
def _pragma(self, name, value, info):
|
||||
global doc_required, returns_whitelist
|
||||
global doc_required, returns_whitelist, name_case_whitelist
|
||||
if name == 'doc-required':
|
||||
if not isinstance(value, bool):
|
||||
raise QAPISemError(info,
|
||||
@ -315,6 +306,13 @@ class QAPISchemaParser(object):
|
||||
"Pragma returns-whitelist must be"
|
||||
" a list of strings")
|
||||
returns_whitelist = value
|
||||
elif name == 'name-case-whitelist':
|
||||
if (not isinstance(value, list)
|
||||
or any([not isinstance(elt, str) for elt in value])):
|
||||
raise QAPISemError(info,
|
||||
"Pragma name-case-whitelist must be"
|
||||
" a list of strings")
|
||||
name_case_whitelist = value
|
||||
else:
|
||||
raise QAPISemError(info, "Unknown pragma '%s'" % name)
|
||||
|
||||
@ -1287,7 +1285,7 @@ class QAPISchemaMember(object):
|
||||
|
||||
def check_clash(self, info, seen):
|
||||
cname = c_name(self.name)
|
||||
if cname.lower() != cname and self.owner not in case_whitelist:
|
||||
if cname.lower() != cname and self.owner not in name_case_whitelist:
|
||||
raise QAPISemError(info,
|
||||
"%s should not use uppercase" % self.describe())
|
||||
if cname in seen:
|
||||
|
@ -443,6 +443,7 @@ qapi-schema += nested-struct-data.json
|
||||
qapi-schema += non-objects.json
|
||||
qapi-schema += pragma-doc-required-crap.json
|
||||
qapi-schema += pragma-extra-junk.json
|
||||
qapi-schema += pragma-name-case-whitelist-crap.json
|
||||
qapi-schema += pragma-non-dict.json
|
||||
qapi-schema += pragma-returns-whitelist-crap.json
|
||||
qapi-schema += qapi-schema-test.json
|
||||
|
@ -1 +1 @@
|
||||
tests/qapi-schema/enum-member-case.json:3: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
|
||||
tests/qapi-schema/enum-member-case.json:4: 'Value' (member of NoWayThisWillGetWhitelisted) should not use uppercase
|
||||
|
@ -1,3 +1,4 @@
|
||||
# Member names should be 'lower-case' unless the enum is whitelisted
|
||||
{ 'pragma': { 'name-case-whitelist': [ 'UuidInfo' ] } }
|
||||
{ 'enum': 'UuidInfo', 'data': [ 'Value' ] } # UuidInfo is whitelisted
|
||||
{ 'enum': 'NoWayThisWillGetWhitelisted', 'data': [ 'Value' ] }
|
||||
|
1
tests/qapi-schema/pragma-name-case-whitelist-crap.err
Normal file
1
tests/qapi-schema/pragma-name-case-whitelist-crap.err
Normal file
@ -0,0 +1 @@
|
||||
tests/qapi-schema/pragma-name-case-whitelist-crap.json:3: Pragma name-case-whitelist must be a list of strings
|
1
tests/qapi-schema/pragma-name-case-whitelist-crap.exit
Normal file
1
tests/qapi-schema/pragma-name-case-whitelist-crap.exit
Normal file
@ -0,0 +1 @@
|
||||
1
|
3
tests/qapi-schema/pragma-name-case-whitelist-crap.json
Normal file
3
tests/qapi-schema/pragma-name-case-whitelist-crap.json
Normal file
@ -0,0 +1,3 @@
|
||||
# 'name-case-whitelist' must be list of strings
|
||||
|
||||
{ 'pragma': { 'name-case-whitelist': null } }
|
Loading…
Reference in New Issue
Block a user