[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL for 2.9 08/49] qapi: Have each QAPI schema declare it
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL for 2.9 08/49] qapi: Have each QAPI schema declare its name rule violations |
Date: |
Thu, 16 Mar 2017 07:27:24 +0100 |
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 <address@hidden>
Message-Id: <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
docs/qapi-code-gen.txt | 6 ++++++
qapi-schema.json | 11 ++++++++++-
scripts/qapi.py | 22 ++++++++++------------
tests/Makefile.include | 1 +
tests/qapi-schema/enum-member-case.err | 2 +-
tests/qapi-schema/enum-member-case.json | 1 +
.../pragma-name-case-whitelist-crap.err | 1 +
.../pragma-name-case-whitelist-crap.exit | 1 +
.../pragma-name-case-whitelist-crap.json | 3 +++
.../pragma-name-case-whitelist-crap.out | 0
10 files changed, 34 insertions(+), 14 deletions(-)
create mode 100644 tests/qapi-schema/pragma-name-case-whitelist-crap.err
create mode 100644 tests/qapi-schema/pragma-name-case-whitelist-crap.exit
create mode 100644 tests/qapi-schema/pragma-name-case-whitelist-crap.json
create mode 100644 tests/qapi-schema/pragma-name-case-whitelist-crap.out
diff --git a/docs/qapi-code-gen.txt b/docs/qapi-code-gen.txt
index 3d17005..2f67900 100644
--- a/docs/qapi-code-gen.txt
+++ b/docs/qapi-code-gen.txt
@@ -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 ===
diff --git a/qapi-schema.json b/qapi-schema.json
index 93e9e98..17c766e 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -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' }
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 1d86d85..78db319 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -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:
diff --git a/tests/Makefile.include b/tests/Makefile.include
index f9da3aa..16e0a9f 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -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
diff --git a/tests/qapi-schema/enum-member-case.err
b/tests/qapi-schema/enum-member-case.err
index b652e9a..3c67a3a 100644
--- a/tests/qapi-schema/enum-member-case.err
+++ b/tests/qapi-schema/enum-member-case.err
@@ -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
diff --git a/tests/qapi-schema/enum-member-case.json
b/tests/qapi-schema/enum-member-case.json
index 2096b35..f8af3e4 100644
--- a/tests/qapi-schema/enum-member-case.json
+++ b/tests/qapi-schema/enum-member-case.json
@@ -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' ] }
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.err
b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
new file mode 100644
index 0000000..f83b97e
--- /dev/null
+++ b/tests/qapi-schema/pragma-name-case-whitelist-crap.err
@@ -0,0 +1 @@
+tests/qapi-schema/pragma-name-case-whitelist-crap.json:3: Pragma
name-case-whitelist must be a list of strings
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.exit
b/tests/qapi-schema/pragma-name-case-whitelist-crap.exit
new file mode 100644
index 0000000..d00491f
--- /dev/null
+++ b/tests/qapi-schema/pragma-name-case-whitelist-crap.exit
@@ -0,0 +1 @@
+1
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.json
b/tests/qapi-schema/pragma-name-case-whitelist-crap.json
new file mode 100644
index 0000000..58382bf
--- /dev/null
+++ b/tests/qapi-schema/pragma-name-case-whitelist-crap.json
@@ -0,0 +1,3 @@
+# 'name-case-whitelist' must be list of strings
+
+{ 'pragma': { 'name-case-whitelist': null } }
diff --git a/tests/qapi-schema/pragma-name-case-whitelist-crap.out
b/tests/qapi-schema/pragma-name-case-whitelist-crap.out
new file mode 100644
index 0000000..e69de29
--
2.7.4
- [Qemu-devel] [PULL for 2.9 00/49] QAPI patches for 2017-03-16, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 02/49] qmp: allow setting properties to empty string in qmp-shell, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 03/49] qapi: Factor QAPISchemaParser._include() out of .__init__(), Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 06/49] docs/qapi-code-gen.txt: Drop confusing reference to 'gen', Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 10/49] tests/qapi-schema: Cover empty union base, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 11/49] qapi: Fix to reject empty union base gracefully, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 01/49] qapi2texi: change texi formatters, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 08/49] qapi: Have each QAPI schema declare its name rule violations,
Markus Armbruster <=
- [Qemu-devel] [PULL for 2.9 07/49] qapi: Have each QAPI schema declare its returns white-list, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 12/49] qapi2texi: Fix up output around #optional, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 04/49] qapi: Make doc comments optional where we don't need them, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 20/49] qapi: Use raw strings for regular expressions consistently, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 14/49] qapi/rocker: Fix up doc comment notes on optional members, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 09/49] qapi: Clean up build of generated documentation, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 27/49] qapi2texi: Include member type in generated documentation, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 24/49] qapi2texi: Explain enum value undocumentedness more clearly, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 17/49] qapi: Conjure up QAPIDoc.ArgSection for undocumented members, Markus Armbruster, 2017/03/16
- [Qemu-devel] [PULL for 2.9 26/49] qapi2texi: Implement boxed argument documentation, Markus Armbruster, 2017/03/16